Professional Documents
Culture Documents
Hasze
Hasze
Hasze wielomianowe
′
A[ x ] - miejsce litery w alfabecie A[ a ] = 1, A[ z ] = 26, A[ x ] =
′ ′ ′ ′ ′ ′ ′ ′ ′ ′
x − a + 1
′
n - długość słowa
n−1
k
w = (∑ p ⋅ A[S k ]) mod M
k=0
Po zmodulowaniu wielomianu, hasz dla dwóch różnych słów może być taki
sam, taką sytuację nazywamy kolizją. Ustalenie p i M jako liczby pierwsze
drastycznie zmniejsza ryzyko wystąpienia takiej sytuacji, ponieważ wartości
dużych wielomianów modulo duża liczba pierwsza są pseudolosowe.
∏M − 1
x
( )
∏M
√∏ M i
10
9
co możemy zrobić?
wziąć jak największe M
użyć kilkukrotnego haszowania z różnymi liczbami pierwszymi M (np.
podwójnego), wtedy pierwiastek z iloczynu wszystkich M powinien być
znacznie większy od liczby porównań, √∏ M ≫ x i
10
5
porównań - dwa modulo
Hasze prefiksowe
liczymy hasze dla kolejnych prefiksów słowa
możemy teraz wyliczyć hasz dla dowolnego podsłowa
przykład
abcab
′ ′
w( a ) = 1
′ ′ ′ ′
w( ab ) = w( a ) ⋅ p + 2 = p + 2
′ ′ ′ ′ 2
w( abc ) = w( ab ) ⋅ p + 3 = p + 2p + 3
′ ′ ′ ′ 3 2
w( abca ) = w( abc ) ⋅ p + 1 = p + 2p + 3p + 1
′ ′ ′ ′ 4 3 2
w( abcab ) = w( abca ) ⋅ p + 2 = p + 2p + 3p + p + 2
′ ′
w( ca ) = 3p + 1
′ ′ ′ ′ ′ ′ 2 3 2 2
w( ca ) = w( abca ) − w( ab ) ⋅ p = (p + 2p + 3p + 1) − (p + 2) ⋅ p =
3 2 3 2
= (p + 2p + 3p + 1) − (p + 2p ) = 3p + 1
Liczby pierwsze
Większe od alfabetu angielskiego
31
37
Bardzo duże
9
10 + 7
9
10 + 9
9
10 + 123
9
10 + 321