Efficiente implementazione hashCode () - java, algoritmo, strutture dati, hashmap, hashcode

Spesso auto-generi una classe hashCode() metodo che utilizza IntelliJ IDEA e in genere il metodo assume la forma:

result = 31 * result + ...

La mia domanda è qual è lo scopo di moltiplicare per 31? So che questo è un numero primo, ma perché scegliere 31 in particolare? Inoltre, se si implementa a hashCode() per un set di dati particolarmente piccolo / grande le persone affrontano questo problema in modo diverso?

risposte:

20 per risposta № 1

Moltiplicare per 31 è veloce perché il JIT può convertirlo in uno spostamento lasciato da 5 bit e una sottrazione:

x * 31 == (x << 5) - x

Senza particolari informazioni aggiuntive, seguirò questo approccio: è ragionevolmente veloce e probabilmente finirà con codici hash ragionevolmente ben distribuiti, ed è anche facile da ottenere a destra :)

La dimensione del set di dati non ha molta importanza, ma se hai particolari informazioni extra sui valori con cui lavorerai (ad es. "È sempre pari") allora tu potrebbe essere in grado di progettare una funzione hash migliore. Aspetterei che sia un problema reale prima però :)


Più popolare