You are on page 1of 3

Hasze

Hasze wielomianowe

A[ x ] - miejsce litery w alfabecie A[ a ] = 1, A[ z ] = 26, A[ x ] =
′ ′ ′ ′ ′ ′ ′ ′ ′ ′
x − a + 1

p - liczba pierwsza większa od wielkości alfabetu

M - duża liczba pierwsza


S - haszowane słowo (indeksowane od 0)

n - długość słowa

n−1

k
w = (∑ p ⋅ A[S k ]) mod M

k=0

Ograniczanie ryzyka wystąpienia kolizji


Nie wolno numerować alfabetu od 0, wtedy ′
a

i ′
aaa

mają taki sam hasz.

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.

Paradoks dnia urodzin


W grupie 23 osób, prawdopodobieństwo, że dwie z nich mają urodziny tego
samego dnia wynosi 50%

√M ≫ x , gdzie x to liczba porównań


chcemy doprowadzić prawdopodobieństwo kolizji do 0, 001%

przybliżone prawdopodobieństwo kolizji


prawdopodobieństwo, że kolizja nie wystąpi

∏M − 1
x
( )
∏M

gdzie x to liczba porównań


jeżeli podniesiemy to jeszcze do potęgi liczba testów, dostaniemy
prawdopodobieństwo, że zadanko wejdzie na 100 punktów
albo
prawdopodobieństwo, że kolizja wystąpi (w przybliżeniu)
x

√∏ M i

gdzie x to liczba porównań


5

chcemy żeby licznik był znacząco mniejszy od mianownika, np. 10

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

hsh[i] = hsh[i − 1] ⋅ p + A[S[i]] , czyli w([1, i])


j−i+1
w([i, j]) = w([1, j]) − w([1, i]) ⋅ p

′ ′ ′ ′ ′ ′ 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

dla każdego modulo liczymy wszystko oddzielnie

Liczby pierwsze
Większe od alfabetu angielskiego
31

37

Bardzo duże
9
10 + 7

9
10 + 9

9
10 + 123

9
10 + 321

You might also like