stringtranslate.com

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

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

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

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

Выбор ч2(к)

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

На практике:

Анализ

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

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

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

Варианты

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

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

Тройное хеширование

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

и

затем

Улучшенное двойное хеширование

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

struct key ; /// Непрозрачный /// При необходимости используйте другие типы данных. (Должны быть беззнаковыми для гарантированной упаковки.) 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 ext_dbl_hash ( struct key const * x , unsigned int hashes [], unsigned int n ) { unsigned int a = h1 ( x ), b = h2 ( x ), i ;                   хэши [ i ] = a ; for ( i = 1 ; i < n ; i ++ ) { a += b ; // Добавляем квадратичную разность, чтобы получить кубическую b += i ; // Добавляем линейную разность, чтобы получить квадратичную // i++ добавляет постоянную разность, чтобы получить линейную хэши [ i ] = a ; } }                 

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

Смотрите также

Ссылки

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

Внешние ссылки