Двойное хэширование — различия между версиями
(→Двойное хэширование) |
(→Двойное хэширование) |
||
Строка 6: | Строка 6: | ||
</center> | </center> | ||
− | + | [[Файл: Вставка при двойном хэшировании.svg.jpeg|thumb|right|Вставка при двойном хэшировании]] | |
− | + | где <tex> h1 </tex> и <tex> h2 </tex> - вспомогательные хеш-функции, <tex> m </tex> - размер хэш-таблицы. Иными словами, последовательность индексов исследуемых ячеек при работе с ключом <tex> k </tex> представляет собой арифметическую прогрессию (по модулю <tex> m </tex>) с первым членом <tex> h_1(k) </tex> и шагом <tex> h_2(k) </tex>. Следовательно, в данном случае последовательность исследования зависит от ключа k по двум параметрам - выбор начальной исследуемой ячейки и расстояние между двумя исследуемыми ячейками, так как оба параметра зависят от значения ключа. | |
+ | |||
+ | Пример вставки элемента при двойном хешировании приведен на рисунке справа. | ||
Показана хэш-таблица размером 13 ячеек, в которой используются вспомогательные функции: | Показана хэш-таблица размером 13 ячеек, в которой используются вспомогательные функции: |
Версия 01:01, 17 мая 2011
Двойное хэширование
Двойное хэширование (double hashing) - один из лучших методов открытой адресации. Перестановки индексов, возникающие при двойном хешировании, обладают свойствами, присущими равномерному хешированию. При двойном хешировании функция h имеет следующий вид:
где
и - вспомогательные хеш-функции, - размер хэш-таблицы. Иными словами, последовательность индексов исследуемых ячеек при работе с ключом представляет собой арифметическую прогрессию (по модулю ) с первым членом и шагом . Следовательно, в данном случае последовательность исследования зависит от ключа k по двум параметрам - выбор начальной исследуемой ячейки и расстояние между двумя исследуемыми ячейками, так как оба параметра зависят от значения ключа.Пример вставки элемента при двойном хешировании приведен на рисунке справа.
Показана хэш-таблица размером 13 ячеек, в которой используются вспомогательные функции:
Мы хотим вставить ключ 14. Изначально
. Тогда . Но ячейка с индексом 1 занята, поэтому увеличиваем на 1 и пересчитываем значение хэш-функции. Делаем так, пока не дойдем до пустой ячейки. При получаем . Ячейка с номером 9 свободна, значит записываем туда наш ключ.Для того, чтобы последовательность исследования могла охватить всю таблицу, значение
должно быть взаимно простым с размером таблицы. Есть два удобных способа это сделать. Первый состоит в том, что в качестве размера таблицы используется простое число, а возвращает натуральные числа, меньшие . Второй - размер таблицы является степенью двойки, а возвращает нечетные значения.Двойное хэширование превосходит другие в смысле количества последовательностей исследований. Это связано с тем, что каждая возможная пара
дает отличающуюся от других последовательность исследований.