Что такое коллизия в хэш-таблицах?

Ответ

Коллизия в хэш-таблице — это ситуация, когда два или более разных ключа получают одинаковый хэш-индекс, что приводит к их попаданию в одну и ту же ячейку (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 -> Коллизия!

Основные стратегии разрешения коллизий:

  1. Метод цепочек (Chaining): Каждая ячейка таблицы является указателем на связанный список (или другую структуру данных), где хранятся все ключи с одинаковым хэшем. Этот метод используется в Go.
  2. Открытая адресация (Open Addressing): Если ячейка занята, элемент помещается в следующую свободную ячейку по определённому правилу (линейное, квадратичное пробирование и т.д.).

Как это работает в Go:

В Go для map используется метод цепочек. Каждая ячейка (bucket) — это массив, в котором могут храниться до 8 пар ключ-значение. Если массив переполняется, создается дополнительный "overflow bucket", связанный с основным. Это позволяет эффективно обрабатывать коллизии, сохраняя высокую производительность.