Общая идея «хэш-таблицы» (которой является «множество хеш-функций») состоит в том, что у вас есть ряд объектов, содержащих значения «ключа» (например, строки символов), которые вы хотите поместить в некоторыесортировать контейнер и затем легко находить отдельные объекты по их «ключевым» значениям, не проверяя каждый элемент в контейнере.
Можно, например, поместить значения в отсортированный массив и затем выполнитьбинарный поиск, чтобы найти значение, но поддержание отсортированного массива стоит дорого, если есть много обновлений.
Таким образом, значения ключей «хэшируются».Можно, например, сложить все значения ASCII символов, чтобы создать одно число, которое является «хешем» строки символов.(Существуют лучшие алгоритмы вычисления хеша, но точный алгоритм не имеет значения, и его легко объяснить.)
Когда вы сделаете это, вы получите число, которое для десятисимвольного символастрока будет в диапазоне от 600 до 1280. Теперь, если вы поделите это, скажем, на 500 и возьмете остаток, вы получите значение от 0 до 499. (Обратите внимание, что строка не должнабыть десятью символами - более длинные строки добавят к большим значениям, но когда вы разделите и возьмете остаток, вы все равно получите число от 0 до 499.)
Теперь создайте массив из 500 записей, и каждыйКогда вы получите новый объект, вычислите его хеш, как описано выше, и используйте это значение для индексации в массиве.Поместите новый объект в запись массива, соответствующую этому индексу.
Но (особенно с приведенным выше алгоритмом наивного хеша) вы можете иметь две разные строки с одинаковым хешем.Например, «ABC» и «CBA» будут иметь одинаковый хэш и в конечном итоге попадут в один и тот же слот в массиве.
Для обработки этого «столкновения» существует несколько стратегий, но наиболее распространенным являетсясоздать связанный список из записи массива и поместить в него различные «синонимы хеша».
Обычно вы пытаетесь сделать массив достаточно большим (и иметь лучший алгоритм вычисления хеша), чтобы минимизировать такиеколлизии, но, используя схему хеширования, невозможно полностью предотвратить коллизии.
Обратите внимание, что несколько записей в списке синонимов не идентичны - они имеют разные значения ключей - но они имеют одинаковый хешзначение.