Двойное хеширование - это метод компьютерного программирования , используемый в сочетании с открытой адресацией в хеш-таблицах для разрешения конфликтов хеширования с использованием вторичного хеш-кода ключа в качестве смещения при возникновении конфликта. Двойное хеширование с открытой адресацией - это классическая структура данных в таблице .
Метод двойного хеширования использует одно значение хеш-функции в качестве индекса в таблице, а затем многократно продвигает интервал вперед до тех пор, пока не будет найдено желаемое значение, не будет достигнуто пустое место или будет произведен поиск по всей таблице; но этот интервал задается второй независимой хеш-функцией . В отличие от альтернативных методов разрешения конфликтов линейного и квадратичного зондирования , интервал зависит от данных, поэтому значения, отображаемые в одно и то же место, имеют разные последовательности сегментов; это сводит к минимуму повторяющиеся столкновения и эффекты кластеризации.
При наличии двух случайных, однородных и независимых хэш-функций и , ое место в последовательности сегментов для значения в хеш-таблице сегментов: Как правило, и выбираются из набора универсальных хеш- функций; выбирается, чтобы иметь диапазон и иметь диапазон . Двойное хеширование приближает случайное распределение; точнее, попарные независимые хеш-функции дают вероятность того, что любая пара ключей будет следовать одной и той же последовательности сегментов.
Выбор h 2 (k) [ править ]
Вторичная хеш-функция должна иметь несколько характеристик:
- он никогда не должен давать нулевой индекс
- он должен проходить через всю таблицу
- это должно быть очень быстро вычислить
- он должен быть попарно независимым от
- Характеристики распределения не имеют значения. Это аналогично генератору случайных чисел - необходимо только, чтобы оно было «взаимно простым» с | T |.
На практике, если хеширование деления используется для обеих функций, делители выбираются как простые числа.
Анализ [ править ]
Пусть будет количество элементов, хранящихся в , тогда коэффициент нагрузки . То есть начните с случайного, равномерного и независимого выбора двух универсальных хеш- функций и построения двойной хеш-таблицы . Все элементы добавляются двойным хешированием с использованием и . Учитывая ключ , то -st хэш местоположение вычисляется с помощью:
Пусть имеет фиксированный коэффициент загрузки .
В этой статье отсутствует информация о том, где остальные доказательства / аргументы ?. Сентябрь 2019 г. ) ( |
Брэдфорд и Катехакис [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 ++ добавляет постоянную разницу, чтобы получить линейную } }
См. Также [ править ]
Ссылки [ править ]
- ^ Брэдфорд, Филипп G .; Katehakis, Михаил Николаевич (апрель 2007), "Вероятностное исследование по комбинаторным расширителям и хешированию" (PDF) , SIAM журнал по вычислениям , 37 (1): 83-111, DOI : 10,1137 / S009753970444630X , MR 2306284 , архивируется с оригинал (PDF) от 25.01.2016.
- ^ Диллинджер, Питер С. (декабрь 2010 г.). Адаптивное приближенное хранилище состояний (PDF) (кандидатская диссертация). Северо-Восточный университет. С. 93–112.
- ^ a b c Кирш, Адам; Митценмахер, Майкл (сентябрь 2008 г.). «Меньше хеширования, та же производительность: создание лучшего фильтра Блума» (PDF) . Случайные структуры и алгоритмы . 33 (2): 187–218. CiteSeerX 10.1.1.152.579 . DOI : 10.1002 / rsa.20208 .
- ^ Диллинджер, Питер С .; Манолиос, Панайотис (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, которая включает функцию двойного хеширования.