Что такое коллизия хеш-функции и как с ней справляются?

«Что такое коллизия хеш-функции и как с ней справляются?» — вопрос из категории Алгоритмы и структуры данных, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Коллизия хеш-функции возникает, когда двум разным входным значениям (ключам) соответствует один и тот же хеш-код. Это фундаментальная проблема хеширования, так как размер хеш-пространства ограничен, а количество возможных ключей – нет.

Почему это проблема?

В структурах данных, основанных на хеш-таблицах (как Dictionary или Set в Swift), коллизии снижают производительность, превращая поиск по ключу из O(1) в O(n) в худшем случае.

Пример коллизии в Swift:

struct User: Hashable {
    let id: Int // Уникальный ID
}

let user1 = User(id: 1)
let user2 = User(id: 2)
// Хотя объекты разные, их хеш-коды МОГУТ совпасть (коллизия).
// Swift автоматически разрешает эту коллизию внутри Dictionary.

Методы разрешения коллизий:

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

Как Swift минимизирует проблему:

  • Hasher с рандомизированным сидом: Хеш-функция меняется между запусками программы, что защищает от атак, основанных на коллизиях, но не устраняет их полностью.
  • Высококачественная хеш-функция: Равномерно распределяет ключи по пространству.
  • Автоматическое управление: Dictionary и Set автоматически увеличивают размер внутренней таблицы и рехешируют элементы при высокой нагрузке (большом количестве коллизий).

Вывод: Коллизии неизбежны, но хорошая хеш-функция и эффективные алгоритмы разрешения коллизий сводят их негативное влияние к минимуму.