
67. Хеш-функции (ключи как натуральные числа, деление с остатком, умножение).
Хеш-функция – это некоторая функция h(k), которая берет некий ключ k и возвращает адрес, по которому производится поиск в хеш-таблице, чтобы получить информацию, связанную с k.
В качестве хеш-функции h(k) выбирается функция, которая более равномерно рассеивает ключи по пространству таблицы. Это важно для уменьшения числа коллизий.
При выборе хеш-функции следует учитывать:
1)сложность ее вычисления;
2)насколько равномерно распределяет она результат хеширования таблицы.
Для очередного ключа все m хеш-значений должны быть равновероятны.
Идеальной хеш-функцией является такая функция, которая для любых двух неодинаковых ключей дает неодинаковые адреса:
k1≠k2 h(k1) ≠ h(k2)
Существует много способов создания функций хеширования, использующих преобразование произвольного натурального числа к натуральному индексу, лежащему в заданном диапазоне 0 .. m. Поэтому перед хешированием значения ключей приводятся к натуральному значению, если по своей природе они таковыми не являются. Например, последовательности ASCII-символов можно интерпретировать как целые числа, записанные в системе счисления с основанием 256. Вещественные числа можно привести к натуральному типу с некоторой заданной точностью, предварительно умножив на соответствующую степень 10.
Основные методы построения хеш-функции:
1.Метод деления с остатком
Ключу k ставится в соответствие остаток от деления k/m (m – число возможных хеш-значений). h(k) = k mod m
Эффективность рассеивания зависит от m.
2.Метод умножения h(k) = [m*(k*A mod 1)]
Здесь производится умножение ключа на некую константу А, лежащую в интервале [0..1]. После этого берется дробная часть этого выражения и умножается на некоторую константу
m, выбранную таким образом, чтобы результат не вышел за границы хеш-таблицы. Оператор [ ] возвращает наибольшее целое, которое меньше аргумента.