Ответ
Коллизия в хэш-таблице — это ситуация, когда два или более разных ключа получают одинаковый хэш-индекс, что приводит к их попаданию в одну и ту же ячейку (bucket) таблицы.
Это нормальное явление, так как хэш-функция отображает потенциально бесконечное множество ключей в ограниченное количество ячеек.
Концептуальный пример:
// Представим, что хэш-функция для map очень проста:
// hash(key) = key % 10
m := make(map[int]string)
m[5] = "apple" // hash(5) = 5. Попадает в ячейку 5.
m[15] = "banana" // hash(15) = 5. Тоже ячейка 5 -> Коллизия!
Основные стратегии разрешения коллизий:
- Метод цепочек (Chaining): Каждая ячейка таблицы является указателем на связанный список (или другую структуру данных), где хранятся все ключи с одинаковым хэшем. Этот метод используется в Go.
- Открытая адресация (Open Addressing): Если ячейка занята, элемент помещается в следующую свободную ячейку по определённому правилу (линейное, квадратичное пробирование и т.д.).
Как это работает в Go:
В Go для map используется метод цепочек. Каждая ячейка (bucket) — это массив, в котором могут храниться до 8 пар ключ-значение. Если массив переполняется, создается дополнительный "overflow bucket", связанный с основным. Это позволяет эффективно обрабатывать коллизии, сохраняя высокую производительность.