Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Метод двойного хеширования использует одно значение хеш-функции в качестве индекса в таблице, а затем многократно продвигает интервал вперед до тех пор, пока не будет найдено желаемое значение, не будет достигнуто пустое место или будет произведен поиск по всей таблице; но этот интервал задается второй независимой хеш-функцией . В отличие от альтернативных методов разрешения конфликтов линейного и квадратичного зондирования , интервал зависит от данных, поэтому значения, отображаемые в одно и то же место, имеют разные последовательности сегментов; это сводит к минимуму повторяющиеся столкновения и эффекты кластеризации.

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

Выбор h 2 (k) [ править ]

Вторичная хеш-функция должна иметь несколько характеристик:

  • он никогда не должен давать нулевой индекс
  • он должен проходить через всю таблицу
  • это должно быть очень быстро вычислить
  • он должен быть попарно независимым от
  • Характеристики распределения не имеют значения. Это аналогично генератору случайных чисел - необходимо только, чтобы оно было «взаимно простым» с | T |.

На практике, если хеширование деления используется для обеих функций, делители выбираются как простые числа.

Анализ [ править ]

Пусть будет количество элементов, хранящихся в , тогда коэффициент нагрузки . То есть начните с случайного, равномерного и независимого выбора двух универсальных хеш- функций и построения двойной хеш-таблицы . Все элементы добавляются двойным хешированием с использованием и . Учитывая ключ , то -st хэш местоположение вычисляется с помощью:

Пусть имеет фиксированный коэффициент загрузки .

Брэдфорд и Катехакис [1] показали, что ожидаемое количество зондов для неудачного поиска , по-прежнему использующее эти изначально выбранные хеш-функции, независимо от распределения входных данных. Достаточно попарной независимости хэш-функций.

Как и все другие формы открытой адресации, двойное хеширование становится линейным по мере приближения хэш-таблицы к максимальной емкости. Обычная эвристика - ограничить загрузку таблицы 75% емкости. В конце концов, как и в случае со всеми другими схемами открытой адресации, потребуется повторное хеширование до большего размера.

Улучшенное двойное хеширование [ править ]

В диссертации Питера Диллинджера [2] указывается, что двойное хеширование создает нежелательные эквивалентные хеш-функции, когда хеш-функции обрабатываются как набор, как в фильтрах Блума : если и , то и наборы хешей идентичны. Это делает столкновение в два раза более вероятным, чем ожидалось .

Кроме того, имеется значительное количество в основном перекрывающихся хэш-наборов; if и , then , и сравнение дополнительных значений хеш-функции (расширение диапазона ) не помогает.

Добавление квадратичного члена [3] ( треугольное число ) или даже ( тройное хеширование ) к хеш-функции несколько улучшает хеш-функцию [3], но не решает эту проблему; если:

и

тогда

Добавление кубического члена [3] или ( тетраэдрического числа ) [4] действительно решает проблему, метод, известный как расширенное двойное хеширование . Это можно эффективно вычислить путем прямого дифференцирования :

 ключ структуры ; // Непрозрачный extern  unsigned  int  h1 ( struct  key  const  * ),  h2 ( struct  key  const  * );// Вычислить k хеш-значений из двух базовых хеш-функций // h1 () и h2 () с использованием расширенного двойного хеширования. При возврате // hashes [i] = h1 (x) + i * h2 (x) + (i * i * i - i) / 6 // Использует преимущества автоматической упаковки (модульное сокращение) // беззнаковых типов в C. void  hash ( struct  key  const  * x ,  unsigned  int  hashes [],  unsigned  int  n ) { unsigned  int  a  =  h1 ( x ),  b  =  h2 ( x ),  i ;для  ( я  =  0 ;  я  <  п ;  я ++ )  {  хеши [ я ]  =  а ; а  + =  Ь ; // Добавляем квадратичную разность, чтобы получить кубический b  + =  i ; // Добавляем линейную разницу, чтобы получить квадратичную  // i ++ добавляет постоянную разницу, чтобы получить линейную } }

См. Также [ править ]

Ссылки [ править ]

  1. ^ Брэдфорд, Филипп G .; Katehakis, Михаил Николаевич (апрель 2007), "Вероятностное исследование по комбинаторным расширителям и хешированию" (PDF) , SIAM журнал по вычислениям , 37 (1): 83-111, DOI : 10,1137 / S009753970444630X , MR  2306284 , архивируется с оригинал (PDF) от 25.01.2016.
  2. ^ Диллинджер, Питер С. (декабрь 2010 г.). Адаптивное приближенное хранилище состояний (PDF) (кандидатская диссертация). Северо-Восточный университет. С. 93–112.
  3. ^ a b c Кирш, Адам; Митценмахер, Майкл (сентябрь 2008 г.). «Меньше хеширования, та же производительность: создание лучшего фильтра Блума» (PDF) . Случайные структуры и алгоритмы . 33 (2): 187–218. CiteSeerX 10.1.1.152.579 . DOI : 10.1002 / rsa.20208 .  
  4. ^ Диллинджер, Питер С .; Манолиос, Панайотис (15–17 ноября 2004 г.). Фильтры Блума в вероятностной проверке (PDF) . 5-я Международная конференция по формальным методам автоматизированного проектирования (FMCAD 2004). Остин, Техас. CiteSeerX 10.1.1.119.628 . DOI : 10.1007 / 978-3-540-30494-4_26 .  

Внешние ссылки [ править ]

  • Как Кэширование Влияет хеширование Грегори Л. Хейлеман и Вэньбиньте Л 2005 год.
  • Анимация хеш-таблицы
  • klib - библиотека C, которая включает функцию двойного хеширования.