Perché è meglio usare un numero primo come mod in una funzione di hashing?


58

Se ho un elenco di valori chiave da 1 a 100 e voglio organizzarli in un array di 11 bucket, mi è stato insegnato a formare una funzione mod

H=kmod 11

Ora tutti i valori verranno posizionati uno dopo l'altro in 9 righe. Ad esempio, nel primo bucket ci saranno . Nel secondo, ci saranno 1 , 12 , 23 ... ecc.0,11,221,12,23

Diciamo che ho deciso di essere un ragazzaccio e di usare un non-prime come funzione di hashing - prendere 12. Uso della funzione Hashing

H=kmod 12

si tradurrebbe in una tabella hash con valori nel primo bucket, 1 , 13 , 25 ... ecc. nel secondo e così via.0,12,241,13,25

Essenzialmente sono la stessa cosa. Non ho ridotto le collisioni e non ho distribuito meglio le cose utilizzando il codice hash del numero primo e non riesco a vedere come sia mai utile.


Questione rilevante, perché usiamo XOR in hash-function stackoverflow.com/questions/5889238/...
Shuva

Risposte:


63

K={0,1,...,100}m=1231233

  • {0,12,24,36,...}0
  • {3,15,27,39,...}3
  • {6,18,30,42,...}6
  • {9,21,33,45,...}9

KKmK33

4m43m/4m/4

In generale:

Km

mKm


Ho appena visto che la mia domanda è in linea con la tua risposta. Pensi che la funzione hash nella mia query sia valida?
Scambio eccessivo il

@overexchange: ho risposto alla tua domanda. Questa risposta potrebbe anche interessarti.
Mario Cervera,

perché la scelta di m è importante solo se K è distorta? non è vero che avremo prestazioni peggiori con cattive m anche se K è distribuito uniformemente?
Vorou,

m

16

Se una collisione è meno probabile utilizzando i numeri primi dipende dalla distribuzione delle chiavi.

a+kbH(n)=nmodmbnb

1112112312


1
a+k×bm

1
mm

12>11

3
bm

8

Se questo ha un impatto (anche) dipende dal modo in cui trattate le collisioni. Quando si utilizzano alcune varianti di hash aperto , l'utilizzo di numeri primi garantisce che vengano trovati slot vuoti purché la tabella sia sufficientemente vuota.

Prova a mostrare quanto segue, ad esempio:

aa+i2i=1,2,

pp3

ppi2=c2


2

h(k)=a×kmodmma1mm=1009Pr{h(x)=h(y),xy}=0.00099108027

Questo schema è noto come: hash universale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.