# Хеш-коллизии Как упоминалось в предыдущем разделе, **в обычных условиях входное пространство хеш-функции значительно больше выходного пространства**, поэтому хеш-коллизии теоретически неизбежны. Например, если входное пространство состоит из всех целых чисел, а выходное пространство соответствует размеру массива, то обязательно несколько целых чисел будут отображаться в один и тот же индекс корзины. Хеш-коллизии могут привести к ошибкам в результатах запросов, серьезно влияя на работоспособность хеш-таблицы. Чтобы решить эту проблему, при возникновении хеш-коллизий выполняется увеличение емкости хеш-таблицы до тех пор, пока коллизии не исчезнут. Этот метод понятен и прост в реализации, но крайне неэффективен, поскольку увеличение емкости хеш-таблицы требует значительных затрат на перенос данных и вычисление хеш-значений. Для повышения эффективности можно использовать следующие стратегии: 1. Улучшение структуры данных хеш-таблицы, **чтобы она могла нормально функционировать при возникновении хеш-коллизий**. 2. Выполнение увеличения емкости только при необходимости, т. е. когда хеш-коллизии становятся достаточно серьезными. Основные методы улучшения структуры хеш-таблицы включают цепную адресацию и открытую адресацию. ## Цепная адресация В исходной хеш-таблице каждая корзина может хранить только одну пару ключ--значение. Цепная адресация преобразует отдельный элемент в связный список, где пары ключ--значение выступают в качестве узлов списка, и все пары ключ--значение, вызвавшие коллизии, хранятся в одном и том же списке. На рис. 6.5 представлен пример хеш-таблицы с цепной адресацией. ![Хеш-таблица с цепной адресацией](../assets/media/image203.jpeg) Методы работы с хеш-таблицей, реализованной на основе цепной адресации, изменяются следующим образом. - **Поиск элемента**: вводится ключ, с помощью хеш-функции определяется индекс корзины, после чего осуществляется доступ к головному узлу списка. Затем выполняется обход списка и сравнение ключей для поиска целевой пары ключ--значение. - **Добавление элемента**: сначала с помощью хеш-функции осуществляется доступ к головному узлу списка, затем узел (пара ключ--значение) добавляется в список. - **Удаление элемента**: на основе результата хеш-функции осуществляется доступ к головному узлу списка, затем выполняется обход списка для поиска целевого узла и его удаления. Цепная адресация имеет следующие ограничения. - **Увеличение занимаемого пространства**: связный список содержит указатели на узлы, что требует больше памяти по сравнению с массивом. - **Снижение эффективности поиска**: поскольку необходимо линейно обходить список для поиска соответствующего элемента. ```src [file]{hash_map_chaining}-[class]{hash_map_chaining}-[func]{} ``` ## Открытая адресация ### Линейная проба ### Квадратичная проба ### Множественное хеширование ## Выбор языка программирования