Читая документацию по MSDN для метода Object.GetHashCode, я натолкнулся на такие фразы, как хэш-функция должна обеспечивать случайное или полезное распределение в хеш-таблице. Что означает это распределение в отношении хеш-функции или хеш-таблицы?
Что означает распределение хеш-функции?
- en.wikipedia.org/wiki/Hash_table 06.04.2012
- Примерно: хеш-значения должны быть распределены случайным образом по их домену без видимой закономерности (например, минимальное скопление и максимальное распространение при визуальном просмотре). Многие реализации хеширования будут повторно хешировать хеш, чтобы уменьшить вероятность появления сгустков при помещении в корзины. 06.04.2012
Ответы:
Хеш-функция производит 32-битное целое число с целью «уравновешивания» хеш-таблицы. Предположим, в вашей таблице есть сотня «корзин», и вы помещаете элементы в таблицу в корзину на основе двух нижних десятичных цифр хеш-функции.
Теперь предположим, что хеш-функция всегда выдает числа, кратные сотне. Каждый элемент будет помещен в одну и ту же корзину, и хеш-таблица будет несбалансированной. Это была бы плохая хеш-функция.
Хороший алгоритм хеширования обеспечивает примерно равномерное распределение независимо от того, сколько у вас сегментов и независимо от того, как вы извлекаете номер сегмента из хеша.
Чтобы хеш-таблицы работали с максимальной эффективностью, хеш-значения должны быть как можно более уникальными, чтобы предотвратить коллизии. Например, давайте рассмотрим чрезвычайно наивную хеш-функцию: допустим, ваши объекты - это имя и фамилия, а в качестве хеш-значения вы выбираете инициалы. Таким образом, значение хеш-функции Джинджер Роджерс - GR, а значение хеш-функции Фреда Астера - FA. Пока все хорошо, но что произойдет, если Фрэнк Аллен предоставит хеш-значение FA? Теперь у вас есть конфликт между Фредом Астером и Фрэнком Алленом, и реализация хеш-таблицы должна обрабатывать это как особый случай, что снижает эффективность.
Лучшие хеш-функции берут входное пространство (Фред Астер) и производят случайное значение (в идеале), уникальное для входного пространства. Пока размер вашего хэша меньше размера ваших данных, невозможно полностью избежать коллизий, но их следует минимизировать, тщательно выбирая алгоритм хеширования.
Как указывает Эрик ниже, хеш-алгоритмы для балансировки хеш-таблиц должны быть очень быстрыми, поэтому вам нужно найти баланс между скоростью и коллизиями. Вы можете изучить криптографические хэш-алгоритмы, такие как SHA-1 (http://en.wikipedia.org/wiki/SHA-1), чтобы понять сложности создания уникальных хешей, но хеш-алгоритмы для балансировки хеш-таблиц должны быть как можно более быстрыми. .