Двойное хэширование — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
'''Двойное хэширование (double hashing)''' - один из методов закрытого хэширования. Перебор ячеек хэш-таблицы, возникающий при двойном хешировании, обладает свойствами, присущими равномерному хешированию. При двойном хешировании хэш-функция <tex> h </tex> имеет следующий вид:
+
'''Двойное хеширование (double hashing)''' - один из методов закрытого хеширования. Перебор ячеек хеш-таблицы, возникающий при двойном хешировании, обладает свойствами, присущими равномерному хешированию. При двойном хешировании хеш-функция <tex> h </tex> имеет следующий вид:
  
 
<center>
 
<center>
Строка 5: Строка 5:
 
</center>
 
</center>
  
[[Файл: Вставка при двойном хэшировании.svg.jpeg|thumb|right|Вставка при двойном хэшировании]]
+
[[Файл: Вставка при двойном хешировании.svg.jpeg|thumb|right|Вставка при двойном хешировании]]
  
где <tex> h_1 </tex> и <tex> h_2 </tex> - вспомогательные хеш-функции, <tex> m </tex> - размер хэш-таблицы. Иными словами, последовательность индексов исследуемых ячеек при работе с ключом <tex> k </tex> представляет собой арифметическую прогрессию (по модулю <tex> m </tex>) с первым членом <tex> h_1(k) </tex> и шагом <tex> h_2(k) </tex>. Следовательно, в данном случае последовательность исследования зависит от ключа k по двум параметрам - выбор начальной исследуемой ячейки и расстояние между двумя исследуемыми ячейками, так как оба параметра зависят от значения ключа.  
+
где <tex> h_1 </tex> и <tex> h_2 </tex> - вспомогательные хеш-функции, <tex> m </tex> - размер хеш-таблицы. Иными словами, последовательность индексов исследуемых ячеек при работе с ключом <tex> k </tex> представляет собой арифметическую прогрессию (по модулю <tex> m </tex>) с первым членом <tex> h_1(k) </tex> и шагом <tex> h_2(k) </tex>. Следовательно, в данном случае последовательность исследования зависит от ключа k по двум параметрам - выбор начальной исследуемой ячейки и расстояние между двумя исследуемыми ячейками, так как оба параметра зависят от значения ключа.  
  
 
Пример вставки элемента при двойном хешировании приведен на рисунке справа.
 
Пример вставки элемента при двойном хешировании приведен на рисунке справа.
  
Показана хэш-таблица размером 13 ячеек, в которой используются вспомогательные функции:
+
Показана хеш-таблица размером 13 ячеек, в которой используются вспомогательные функции:
  
 
<center>
 
<center>
Строка 21: Строка 21:
 
</center>
 
</center>
  
Мы хотим вставить ключ 14. Изначально <tex> i = 0 </tex>. Тогда <tex> h(14,0) = (h_1(14) + 0\cdot h_2(14)) \; mod \; 13 = 1 </tex>. Но ячейка с индексом 1 занята, поэтому увеличиваем <tex> i </tex> на 1 и пересчитываем значение хэш-функции. Делаем так, пока не дойдем до пустой ячейки. При <tex> i = 2 </tex> получаем <tex> h(14,2) = (h_1(14) + 2\cdot h_2(14)) \; mod \; 13 = 9 </tex>. Ячейка с номером 9 свободна, значит записываем туда наш ключ.
+
Мы хотим вставить ключ 14. Изначально <tex> i = 0 </tex>. Тогда <tex> h(14,0) = (h_1(14) + 0\cdot h_2(14)) \; mod \; 13 = 1 </tex>. Но ячейка с индексом 1 занята, поэтому увеличиваем <tex> i </tex> на 1 и пересчитываем значение хеш-функции. Делаем так, пока не дойдем до пустой ячейки. При <tex> i = 2 </tex> получаем <tex> h(14,2) = (h_1(14) + 2\cdot h_2(14)) \; mod \; 13 = 9 </tex>. Ячейка с номером 9 свободна, значит записываем туда наш ключ.
  
 
Для того, чтобы последовательность исследования могла охватить всю таблицу, значение <tex> h_2 </tex> должно быть взаимно простым с размером таблицы. Есть два удобных способа это сделать. Первый состоит в том, что в качестве размера таблицы используется простое число, а <tex> h_2 </tex> возвращает натуральные числа, меньшие <tex> m </tex>. Второй - размер таблицы является степенью двойки, а <tex> h_2 </tex> возвращает нечетные значения.
 
Для того, чтобы последовательность исследования могла охватить всю таблицу, значение <tex> h_2 </tex> должно быть взаимно простым с размером таблицы. Есть два удобных способа это сделать. Первый состоит в том, что в качестве размера таблицы используется простое число, а <tex> h_2 </tex> возвращает натуральные числа, меньшие <tex> m </tex>. Второй - размер таблицы является степенью двойки, а <tex> h_2 </tex> возвращает нечетные значения.
  
Двойное хэширование превосходит другие в смысле количества последовательностей исследований. Это связано с тем, что каждая возможная пара <tex> (h_1(k),h_2(k)) </tex> дает отличающуюся от других последовательность исследований.
+
Двойное хеширование превосходит другие в смысле количества последовательностей исследований. Это связано с тем, что каждая возможная пара <tex> (h_1(k),h_2(k)) </tex> дает отличающуюся от других последовательность исследований.
  
 
== Литература ==
 
== Литература ==
 
* Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. '''Алгоритмы. Построение и анализ''' —  Вильямс, 2010. - 1296с. — ISBN 978-5-8459-0857-4, 0-07-013151-1.
 
* Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. '''Алгоритмы. Построение и анализ''' —  Вильямс, 2010. - 1296с. — ISBN 978-5-8459-0857-4, 0-07-013151-1.

Версия 20:30, 17 мая 2011

Двойное хеширование (double hashing) - один из методов закрытого хеширования. Перебор ячеек хеш-таблицы, возникающий при двойном хешировании, обладает свойствами, присущими равномерному хешированию. При двойном хешировании хеш-функция [math] h [/math] имеет следующий вид:

[math] h(k,i) = (h_1(k) + i\cdot h_2(k)) \; mod \; m [/math]

Файл:Вставка при двойном хешировании.svg.jpeg
Вставка при двойном хешировании

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

Пример вставки элемента при двойном хешировании приведен на рисунке справа.

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

[math] h_1(k) = k \; mod \; 13 [/math]

[math] h_2(k) = 1 + k \; mod \; 11 [/math]

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

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

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

Литература

  • Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Алгоритмы. Построение и анализ — Вильямс, 2010. - 1296с. — ISBN 978-5-8459-0857-4, 0-07-013151-1.