Двойное хеширование
Двойное хеширование — это метод компьютерного программирования, используемый в сочетании с открытой адресацией в хеш-таблицах для разрешения коллизий хэшей путем использования вторичного хеша ключа в качестве смещения при возникновении коллизии. Двойное хеширование с открытой адресацией — классическая структура данных в таблице. .
Метод двойного хеширования использует одно значение хеш-функции в качестве индекса таблицы, а затем несколько раз перемещается вперед на интервал до тех пор, пока не будет найдено желаемое значение, не будет достигнуто пустое место или не будет выполнен поиск по всей таблице; но этот интервал задается второй независимой хеш-функцией . В отличие от альтернативных методов разрешения коллизий, таких как линейное зондирование и квадратичное зондирование , интервал зависит от данных, поэтому значения, отображаемые в одном и том же месте, имеют разные последовательности сегментов; это сводит к минимуму повторяющиеся столкновения и эффекты кластеризации .
Даны две случайные, однородные и независимые хэш-функции. и , место в последовательности сегментов для значения в хеш-таблице ведра это: В целом, и выбираются из набора универсальных хэш- функций; выбран так, чтобы иметь диапазон и иметь диапазон . Двойное хеширование приближает случайное распределение; точнее, попарно независимые хэш-функции дают вероятность что любая пара ключей будет следовать одной и той же последовательности.
Выбор ч 2 (к)
[ редактировать ]Вторичная хэш-функция должен иметь несколько характеристик:
- Он никогда не должен давать нулевой индекс.
- Он должен пройти через всю таблицу.
- Вычисление должно происходить очень быстро.
- Он должен быть попарно независимым от .
- Характеристики распределения не имеют значения. Это аналог генератора случайных чисел.
- Все должно быть относительно простым | Т |.
На практике:
- Если для обеих функций используется хеширование деления, делители выбираются как простые числа.
- Если | Т | является степенью двойки, первое и последнее требования обычно удовлетворяются, если сделать всегда возвращайте нечетное число. Побочным эффектом этого является удвоение вероятности коллизии из-за одного потерянного бита. [1]
Анализ
[ редактировать ]Позволять быть числом элементов, хранящихся в , затем коэффициент загрузки . То есть начните со случайного, равномерного и независимого выбора двух универсальных хэш- функций. и построить таблицу двойного хеширования . Все элементы вставлены путем двойного хеширования с использованием и . Учитывая ключ , -st местоположение хеша вычисляется по:
Позволять иметь фиксированный коэффициент нагрузки . Брэдфорд и Катехакис [2] показал ожидаемое количество зондов при неудачном поиске в , все еще использующий эти изначально выбранные хэш-функции, независимо от распределения входов. Достаточно попарной независимости хэш-функций.
Как и все другие формы открытой адресации, двойное хеширование становится линейным, когда хеш-таблица приближается к максимальной емкости. Обычная эвристика заключается в ограничении загрузки таблицы до 75% емкости. В конце концов, как и во всех других схемах открытой адресации, потребуется перефразирование до большего размера.
Варианты
[ редактировать ]Кандидатская диссертация Питера Диллинджера [3] указывает, что двойное хеширование создает нежелательные эквивалентные хэш-функции, когда хэш-функции рассматриваются как набор, как в фильтрах Блума : Если и , затем и наборы хешей идентичны. Это делает столкновение вдвое более вероятным, чем ожидалось. .
Кроме того, существует значительное количество преимущественно перекрывающихся хеш-наборов; если и , затем и сравнение дополнительных хеш-значений (расширение диапазона ) бесполезно.
Тройное хеширование
[ редактировать ]Добавление квадратичного члена [4] ( треугольное число ) или даже ( тройное хеширование ) [5] к хеш-функции несколько улучшает хеш-функцию [4] но не решает эту проблему; если:
- и
затем
Улучшенное двойное хеширование
[ редактировать ]Добавление кубического члена [4] или ( тетраэдрическое число ), [1] Проблему решает метод, известный как улучшенное двойное хеширование . Это можно эффективно вычислить путем прямого дифференцирования :
struct key; /// Opaque
/// Use other data types when needed. (Must be unsigned for guaranteed wrapping.)
extern unsigned int h1(struct key const *), h2(struct key const *);
/// Calculate k hash values from two underlying hash functions
/// h1() and h2() using enhanced double hashing. On return,
/// hashes[i] = h1(x) + i*h2(x) + (i*i*i - i)/6.
/// Takes advantage of automatic wrapping (modular reduction)
/// of unsigned types in C.
void ext_dbl_hash(struct key const *x, unsigned int hashes[], unsigned int n)
{
unsigned int a = h1(x), b = h2(x), i;
hashes[i] = a;
for (i = 1; i < n; i++) {
a += b; // Add quadratic difference to get cubic
b += i; // Add linear difference to get quadratic
// i++ adds constant difference to get linear
hashes[i] = a;
}
}
Помимо устранения проблемы коллизий, улучшенное двойное хеширование также устраняет числовые ограничения двойного хеширования на свойства, позволяющие использовать хеш-функцию, аналогичную по свойствам (но все же независимую от нее) быть использованным. [1]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: Перейти обратно: а б с Диллинджер, Питер К.; Манолиос, Панайотис (15–17 ноября 2004 г.). Фильтры Блума в вероятностной проверке (PDF) . 5-я Международная конференция по формальным методам в автоматизированном проектировании (FMCAD 2004). Остин, Техас. CiteSeerX 10.1.1.119.628 . дои : 10.1007/978-3-540-30494-4_26 .
- ^ Брэдфорд, Филипп Г.; Катехакис, Майкл Н. (апрель 2007 г.), «Вероятностное исследование комбинаторных расширителей и хеширования» (PDF) , SIAM Journal on Computing , 37 (1): 83–111, doi : 10.1137/S009753970444630X , MR 2306284 , заархивировано из оригинал (PDF) от 25 января 2016 г.
- ^ Диллинджер, Питер К. (декабрь 2010 г.). Адаптивное хранилище приближенных состояний (PDF) (кандидатская диссертация). Северо-Восточный университет. стр. 93–112.
- ^ Jump up to: Перейти обратно: а б с Кирш, Адам; Митценмахер, Майкл (сентябрь 2008 г.). «Меньше хэширования, та же производительность: создание лучшего фильтра Блума» (PDF) . Случайные структуры и алгоритмы . 33 (2): 187–218. CiteSeerX 10.1.1.152.579 . дои : 10.1002/rsa.20208 .
- ^ Альтернативно определяется треугольным числом, как у Dillinger 2004.
Внешние ссылки
[ редактировать ]- Как кэширование влияет на хеширование , Грегори Л. Хейлеман и Венбин Луо, 2005.
- Анимация хэш-таблицы
- klib — библиотека C, включающая функцию двойного хеширования.