Принцип Hash и осуществление глобальной
1-хэш хэш Введение
2-Universal хэширования глобальное хэширования
3- построить глобальную хэш-H \ mathcal {H} Н
4-Python достичь
1-хэш хэш Введение
хэш-функция у = Н (к) у = Н (К) у = Н (К), ввод произвольной длины KKK через хэш-алгоритма HHH YYY в выходной фиксированной длины, выходное значение хэш-1. Общая хеш-функция у = Н (к) = (a⋅k + Ь) мод мой = H (K) = (A \ CDOT К + В) \ моде моего = Н (к) = (a⋅k + б) МПМ, MMM как правило, простое число.
хэш-функция домена обеспечивается из KKK, диапазон YYY, в общем, | K |> | Y | | K |> | Y | | K |> | Y |, поэтому склонны к коллизии хэш-функции, как показано ниже, ч (K5) = Н (К2) = H (K7) ч (k_5) = Н (K_2) = Н (k_7) ч (K5) = Н (К2) = H (K7), k5, к2, k7k_5, K_2 , k_7k5, k2, k7 на цепи (столкновения):
Для хэш-функции, в основном в состоянии найти набор входных данных, так что их хэш-значения совпадают, что приводит их в цепи, а иногда даже выглядит, чем линейная сложность еще выше, потому что больше времени хэш поиска, чем линейный ,
2-Universal хэширования глобальное хэширования
Идея: Один из способов решения этой проблемы является случайной. Случайный выбор из множества хэш-функций (семейство хеш-функций). Так что выбирайте, нет другого пути, чтобы построить множество входов для конкретной хэш-функции, что хэш-функцией является очень низкой эффективностью.
Определено 1: U \ mathcal {U} U определен домены, Н \ mathcal {H} Н множество хэш-функций, может быть U \ mathcal {U} U сопоставляются {0,1, ..., M-1 } \ {0, 1, ..., т-1 \} {0,1, ..., M-1}, т.е. ч: U → {0,1, ..., M-1}, ч ∈Hh: \ mathcal {U} \ RightArrow \ {0, 1, ..., т-1 \}, ч \ в \ mathcal {H} H: U → {0,1, ..., M-1 }, h∈H.
Определение 2: Если ∀x, у \ FORALL х, y∀x, у удовлетворяют х ≠ ух \ NEQ yx = у и | {h∈H: Н (х) = Н (у)} | = | Н | м | \ {ч \ в \ mathcal {H}: Н (х) = Н (у) \} | = \ гидроразрыва {| \ mathcal {H} |} {т} | {h∈H: Н (х) = ч (у)} | = т | H |, называется H \ mathcal {H} H является глобальным (Universal) есть.
2 По определению, если ч равномерно случайным образом из H mathcal {H} H Выберите \ (Обратите внимание, что каждый вход для повторного выбора хеш-функции), то вероятность столкновения ххх и ууу являются:
Количество функции Н (х) = Н (у) является функцией всех = | Н | м | H |. = 1м \ {Количество функция Н (х) = Н (у) является функцией всех} гидроразрыва {}
= \ Гидроразрыва {\ гидроразрыва {| \ mathcal {H} |} {т}} {| \ mathcal {H} |}. = \ Гидроразрыва {1} {т} все функции Н (х) = Н (у) номер функции = | H | м | H | = m1.
Теорема 1: равномерно случайным образом из Н \ mathcal {H} H (H \ mathcal {H} H является вся область) выбрана HHH, если мы теперь поместить NNN вход в хэш-таблицу в ТТТ, а затем дать введите ххх, там
Е [х, а количество Т-элементов в хэш-таблице столкновений]
Где Е [⋅] E [\ CDOT] E [⋅] обозначает математическое ожидание.
[Значение теоремы 1], доказав выше теоремы, мы можем сказать, что, если H \ mathcal {H} Н, окончательное распределение элементов во всей области в хэш-таблице TTT (в среднем смысле) является однородным.
Доказательство теоремы 1 Пусть CxC_ {х} Cx представляет собой число случайных элементов в хэш-таблице и ххх столкновения ТТТ, при условии,
Cxy = {1, если (х) = Н (у) 0, если А (х) ≠ ч (у) C_ {ху} = \ влево \ {\ {начинаются массив} {} кр
1 &, если \ (х) = Н (у) \\
0 &, если \ ч (х) \ NEQ ч (у)
\ {Конец массива} \ right.Cxy = {10При (х) = Н (у), если (х) = ч (у)
Ну,
Е [Сх] = E [Σy∈T-xCxy] = Σy∈T-Xe [Cxy] Так как желаемые свойства линейности = Σy∈T-X1M = (п-1) 1м
Е [C_x] & = Е [\ sum_ {у \ в Tx} C_ {х}] \\
& = \ Sum_ {у \ в Tx} Е [C_ {х}] & потому желательные линейных свойства \\
& = \ Sum_ {у \ в Tx} \ гидроразрыва {1} {M} \\
& = (П-1) \ гидроразрыва {1} {т} \\
& <\ Гидроразрыва {п} {т}.
\ {Конец массива} Е [Сх] = E [Σy∈T-xCxy] = Σy∈T-Xe [Cxy] = Σy∈T-XM1 = (п-1) m1
Пример: Если п = 1, т = 2n = 1, т = 2n = 1, т = 2, то Е [Сх] <12.E [C_x] <\ гидроразрыва {1} {2} .E [Сх] < 21.
3- построить глобальную хэш-H \ mathcal {H} Н
Теорема 2: в соответствии со следующим четыре шага конфигурации Н \ mathcal {H} Н все поля:
(Условие) Заказ ммм равен простое число;
(Начальная подготовка) вход KKK написал г + 1r + 1r + 1 цифры: K = K = K =, где ki∈ {0,1, ..., M-1} K_i \ в \ {0, 1, ..., т-1 \} ki∈ {0,1, ..., M-1} (эквивалентно гексадецималах по KKK ттт);
(Случайный) случайного выбора а = а = а =, в котором ai∈0,1, ..., м-1a_i \ в {0, 1, ..., M-1} ai∈0,1, .. ., м-1;
(Хэш 函数) га (к) = (сг = 0i = раи × ки) мод mh_a (к) = (\ sum_ {I = 0} ^ {я = г} a_i \ раз K_i) \ мод MHA (к) = (сг = 0i = раи × кий) МАЯ.
См 2 доказательства.
4-Python достичь
Для того, чтобы написать свой собственный код, поправьте меня, если неправильно взгляд. Код ссылки: https: //github.com/VFVrPQ/LDP/blob/master/Components/UniversalHashing.py, в противном случае полный код выглядит следующим образом:
импорт математика
импорт случайных
Класс универсальное хеширование:
«»»
г: простой
д: домен, [0, 1, ..., d-1]
Len: Максимальное количество цифр в г Base
V: входное значение в [0, 1, ..., d-1]
хэш-функция: H_A (а) = (а (0) * к (0) + а (1) * к (1) + ... + а (а-1) * к (только-1))% г
«»»
Защиту __init __ (я, г, д):
самостоятельно .__ г = г
утверждают, г> = 2, «г меньше, чем 2»
утверждают само .__ IsPrime (г), «г не является простым»
самостоятельно .__ д = д
Собственной .__ Len = Math.ceil (Math.log (г) / Math.log (г)) # г-диапазона, максимальное число битов
самостоятельно .__ а = само .__ Len * [0] # начальная длина
# V представляет собой входное значение в [0, 1, ..., d-1]
Защита хэш (я, v):
само .__ хаотичность () # регенерировать, выберите H
из = self.calc (само .__ а, v)
Самовозврат .__ а, из
Вычислено H_A # (к) = (а (0) * к (0) + а (1) * к (1) + ... + а (а-1) * к (только-1))% г
Защита известково (Я, а, v):
утверждают только (а) == само .__ только «только (А)! = само .__ только '
к = само .__ toBitList (v)
из = 0 Сколько денег Чжэнчжоу выкидыши http://mobile.sgyy029.com/
для я в диапазоне (само .__ LEN):
OUT = (выход + в [I] * к [I])% собственного .__ г
вернуться из
Защиту __randomness (самостоятельно):
# Генерировать
для я в диапазоне (само .__ LEN):
самостоятельно .__ а [I] = random.randint (0, само .__ г-1)
Защиту __toBitList (Я, v):
v утверждают> = 0, 'v <0'
если v == 0:
Самовозврат .__ Len * [0]
Bitliste = само .__ человек * [0]
для я в диапазоне (само .__ LEN):
bitList [I] = v% собственной .__ г
v = INT (об / с собственной .__ г)
возвращение Bitliste
Защиту __isPrime (Я, v):
Если V <= 1:
возвращение Ложные
для я в диапазоне (2, Int (Math.sqrt (V)) + 1, 1):
если v% я == 0:
возвращение Ложные
возвращающие
# для теста
если __name__ == "__main__":
РАЗ = 10
г = 29 # простое
d = 16 # домена
uhash = универсальное хеширование (г, д)
Н = г * [0]
для г в диапазоне (TIMES): # случайные моменты времени для проверки
х = random.randint (0, д-1)
_, Из = uhash.hash (х)
Н [выход] + = 1
для г в интервале (г):
печать (I, H [I])