Stavo esaminando l'esame finale delle mie strutture dati e mi sono imbattuto in una domanda nella finale dell'anno scorso. Avendo lavorato su di esso nelle ultime tre ore, non riuscivo ancora a trovare un modo per risolverlo, se non per tentativi ed errori. Ecco la domanda:Trovare collisioni nella tabella hash
"Supponiamo che la dimensione della tabella hash è 31, la costante g è anche 31, e di utilizzare il seguente codice hash
int hash = 0;
int n = s.length();
for (int i = 0; i < n; i++)
hash = g * hash + s.charAt(i);
e di utilizzare concatenazioni separate per risolvere collisioni: elenca cinque nomi diversi che vorrebbero l'hash nella stessa posizione nella tabella. "
Penso che ci debba essere una sorta di trucchi, possibilmente coinvolgendo l'operatore modulo, per risolvere questo problema, considerando che la dimensione della tabella hash è 31, che è la stessa della costante g. Scusa se ti sembra così, ma non chiedo codice o altro, solo alcuni pensieri/suggerimenti sulla domanda. Ogni commento è molto apprezzato. Grazie
Interessante! Grazie mille per averlo indicato. –
Felice di aiutare ... –
Btw, questa implementazione di hashing lascia Java aperto a un attacco DoS! Vedi http://www.ocert.org/advisories/ocert-2011-003.html, http://cryptanalysis.eu/blog/2011/12/28/effective-dos-attacks-against-web-application-plattforms -hashdos/o google per attacchi DoS utilizzando le mappe hash. – yshavit