Изменения

Перейти к: навигация, поиск

Двойное хэширование

3823 байта добавлено, 00:43, 17 мая 2011
Новая страница: «== Двойное хэширование == '''Двойное хэширование (double hashing)''' - один из лучших методов открытой…»
== Двойное хэширование ==
'''Двойное хэширование (double hashing)''' - один из лучших методов открытой адресации. Перестановки индексов, возникающие при двойном хешировании, обладают свойствами, присущими равномерному хешированию. При двойном хешировании функция h имеет следующий вид:

<center>
<tex> h(k,i) = (h_1(k) + i*h_2(k)) mod m </tex>
</center>

где <tex> h1 </tex> и <tex> h2 </tex> - вспомогательные хеш-функции, <tex> m </tex> - размер хэш-таблицы. Иными словами, последовательность индексов исследуемых ячеек при работе с ключом <tex> k </tex> представляет собой арифметическую прогрессию (по модулю <tex> m <tex>) с первым членом <tex> h_1(k) <tex> и шагом h_2(k). Следовательно, в данном случае последовательность исследования зависит от ключа k по двум параметрам - выбор начальной исследуемой ячейки и расстояние между двумя исследуемыми ячейками, так как оба параметра зависят от значения ключа. Пример вставки элемента при двойном хешировании приведен на рисунке.

[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]

Показана хэш-таблица размером 13 ячеек, в которой используются вспомогательные функции:

<center>
<tex> h_1(k) = k mod 13 </tex>
</center>

<center>
<tex> h_2(k) = 1 + k mod 11 </tex>
</center>

Мы хотим вставить ключ 14. Изначально <tex> i = 0 </tex>. Тогда <tex> h(14,0) = (h_1(14) + 0*h_2(14)) mod 13 = 1 </tex>. Но ячейка с индексом 1 занята, поэтому увеличиваем <tex> i </tex> на 1 и пересчитываем значение хэш-функции. Делаем так, пока не дойдем до пустой ячейки. При <tex> i = 2 </tex> получаем <tex> h(14,2) = (h_1(14) + 2*h_2(14)) mod 13 = 9 </tex>. Ячейка с номером 9 свободна, значит записываем туда наш ключ.

Для того, чтобы последовательность исследования могла охватить всю таблицу, значение <tex> h2 </tex> должно быть взаимно простым с размером таблицы. Есть два удобных способа это сделать. Первый состоит в том, что в качестве размера таблицы используется простое число, а <tex> h2 </tex> возвращает натуральные числа, меньшие <tex> m </tex>. Второй - размер таблицы является степенью двойки, а <tex> h2 </tex> возвращает нечетные значения.

Двойное хэширование превосходит другие в смысле количества последовательностей исследований. Это связано с тем, что каждая возможная пара <tex> (h_1(k),h_2(k)) </tex> дает отличающуюся от других последовательность исследований.
Анонимный участник

Навигация