Strukture podataka i algoritmi
8.5.3 Hash funkcije

Izbor dobre hash funkcije h(k) je osnovni problem kod koriscenja hash tabela za pretrazivanje. Funkcija h bi trebalo da raspodeli elemente naseg skupa sto je moguce ravnomernije u polja hash tabele. Kljucni kriterijum je da bi broj sudara trebalo da bude sto manji.

Ako je P(k) verovatnoca da se kljuc k pojavljuje u nasem skupu, tada bi, ako postoji m polja u nasoj hash tabeli, uniforma hash funkcija h(k) osigurala da:

Ponekad je ovo jednostavno obezbediti. Na primer, ako su kljucevi slucajno rasporedjeni u intervalu (0,r], tada funkcija

h(k) = floor((mk)/r)

obezbedjuje ravnomerno hashiranje.

Preslikavanje kljuceva u prirodne brojeve

Vecina hash funkcija ce najpre preslikati kljuceve u neki skup prirodnih brojeva, recimo (0,r]. Postoji mnogo nacina da se ovo uradi, na primer, ako je kljuc niz ASCII znakova, mozemo jednostavno da saberemo ASCII brojeve znakova po modulu 255 da bismo dobili broj u intervalu [0,255) - ili mozemo na njih da primenimo xor, ili ih mozemo sabirati u parovima po modulu 216-1, or ...

Posto smo preslikali kljuceve u skup prirodnih brojeva, imamo puno mogucnosti za hash funkciju.

  1. Koristiti funkciju mod:

    h(k) = k mod m.

    Pri koriscenju ovog metoda, izbegavaju se odredjene vrednosti m. Obicno se izbegavaju stepeni dvojke, jer k mod 2b jednostavno daje b najnizih bitova broja k. Osim u slucaju da znamo da su svih 2b mogucih vrednosti najnizih bitova podjednako verovatne, ovo ne bi bio dobar izbor, jer se neki bitovi kljuca ne koriste u hash funkciji.

    U principu, prosti brojevi koji su bliski stepenima dvojke izgledaju kao povoljan izbor za m.

    Na primer, ako imamo 4000 elemenata, i izabrali smo organizaciju sa oblascu prelivanja, ali zelimo da sto je vise moguce smanjimo verovatnocu sudara, tada bismo mogli da izaberemo m = 4093. (4093 je najveci ceo broj manji od 4096 = 212.)

  2. Koristiti metod mnozenja:

    Prema tome, hash funkcija je:

    h(k) = floor(m * (kA - floor(kA)))

    U ovom slucaju, vrednost m nije kriticna i obicno se bira stepen dvojke, tako da mozemo da dobijemo sledecu efikasnu proceduru na vecini racunara:

  3. Koristiti univerzalno hashiranje:

    Zlobni protivnik bi uvek mogao da izabere kljuceve tako da se oni svi preslikavaju u isto polje hash tabele, prouzrokujuci prosecno O(n) vreme za pretrazivanje. Univerzalno hashiranje pokusava da izbegne ovu situaciju birajuci hash funkciju slucajno iz skupa hash funkcija. Ovo smanjuje verovatnocu da ce hash funkcija dati lose ponasanje i u proseku daje dobre performanse.

Kljucni pojmovi

Univerzalno hashiranje
Tehnika za slucajan izbor hash funkcije kako bi se uvek dobile solidne prosecne performanse.

Dalje na Algoritamske tehnike
Nazad na Sadrzaj
© John Morris, 1998. Prevod sa engleskog, Dragan Stevanovic, 2002.