Stavo leggendo sull'approccio di Java per randomizzare le chiavi di hash here
Apparentemente l'idea è di assicurarsi che i bit inferiori siano "casuali" per aiutare la distribuzione ma sto cercando di capirlo di più.
Quindi se abbiamo una tabella di dimensione 10 allora i numeri 0,10,20,30,40 ecc cadono tutti nel secchio 0, i numeri 1,11,21,31 ecc cadono nel secchio 1 ecc. (Usando il modulo 10) .
Quindi, cambiando i pattern di bit, potresti farli andare su diversi bucket invece di passare al bucket 0.
Ma quello di cui non sono chiaro è quale sia la proprietà che fa in modo che i bit di ordine basso influiscano su questo e dobbiamo randomizzare loro. Quindi abbiamo:Quale proprietà del pattern di bit è quella che causa collisioni?
0000 0000 (0)
0000 1010 (10)
0001 0100 (20)
0001 1110 (30)
0010 1000 (40)
Qual è la regolarità nei bit di ordine basso che li rende posizione per lo stesso slot?
Forse sono confuso su quanto segue? La mia comprensione è che è un po 'di regolarità nei bit di basso ordine che causano collisioni e proviamo a randomizzare bit per compensare
non mi è chiaro su questo: '..ma per le implementazioni di hash in cui il numero di secchi è sempre una potenza di 2, il fatto che tutti gli hash sono divisibili per 8 significherebbe che la maggior parte dei secchi erano vuoti. Che cos'è l'8? La dimensione dell'indirizzo? E perché succede per le dimensioni del potere di 2? Potresti per favore elaborare un po 'su questo? – Jim
@Jim: 8 è (un esempio) di tipico allineamento dell'hardware: quasi tutti gli oggetti hanno indirizzi divisibili per 8, perché la CPU può leggere otto byte allineati in un singolo accesso (mentre se l'oggetto fosse diviso sopra il limite, occorrerebbe due accessi alla memoria). E se riduci un numero divisibile per otto moduli di una potenza di 2, finisci con un valore divisibile per otto, quindi sette su otto secchi non saranno usati. – rici