La domanda chiave è qual è la tua chiave. (Nessun gioco di parole.) Come altri hanno sottolineato, l'obiettivo è di minimizzare il numero di collisioni di hash. Se è possibile ottenere il numero di collisioni hash a zero, ovvero la funzione di hash genera un valore univoco per ogni chiave che viene effettivamente passata ad esso, si avrà un hash perfetto.
Si noti che in Java, una funzione di hash ha in realtà due passaggi: prima la chiave viene eseguita attraverso la funzione hashCode per la sua classe. Quindi calcoliamo un valore di indice nella tabella hash prendendo questo valore modulo la dimensione della tabella hash.
Penso che le persone che parlano della funzione di hash perfetta tendano a dimenticare quel secondo passaggio. Anche se hai scritto una funzione hashCode che ha generato un valore univoco per ogni chiave passata, potresti comunque ottenere un hash assolutamente terribile se questo valore modulo la dimensione della tabella hash non è univoco. Ad esempio, supponiamo di avere 100 chiavi e la funzione hashCode restituisce i valori 1, 1001, 2001, 3001, 4001, 5001, ... 99001. Se la tabella hash ha 100.000 slot, questo sarebbe un hash perfetto. Ogni chiave ha il suo spazio. Ma se ha 1000 slot, hanno tutti hash nello stesso slot. Sarebbe il peggior hash possibile.
Considerare quindi la costruzione di una buona funzione di hash. Prendi i casi estremi. Supponiamo che la tua chiave sia una data. Sai che le date saranno tutte nel gennaio dello stesso anno. Quindi utilizza il giorno del mese in quanto il valore hash dovrebbe essere buono come quello che otterrà: tutto eseguirà un hash su un numero intero univoco in un intervallo limitato. D'altra parte, se le tue date fossero tutte le primissime del mese per molti anni e molti mesi, prendere il giorno del mese sarebbe un terribile hash, dato che ogni vera chiave sarebbe mappata su "1".
Il mio punto è che se si desidera ottimizzare il proprio hash, è necessario conoscere la natura dei dati. Qual è l'attuale gamma di valori che otterrai?
di che tipo è la chiave? – jjnguy
Inserendo questo come commento perché non risponde veramente alla tua domanda. Ma se stai usando un java.util.Hashtable, non farlo. Usa una java.util.HashMap invece –