Pourquoi n'utilisez-vous pas un long
variante de la valeur par défaut String.hashCode()
(où quelques très intelligent de gars certainement de faire des efforts dans ce qui la rend efficace - de ne pas mentionner les milliers de développeurs yeux que déjà regardé ce code)?
// adapted from String.hashCode()
public static long hash(String string) {
long h = 1125899906842597L; // prime
int len = string.length();
for (int i = 0; i < len; i++) {
h = 31*h + string.charAt(i);
}
return h;
}
Si vous êtes à la recherche pour encore plus de bits, vous pourriez probablement utiliser un BigInteger
Edit:
Comme je l'ai mentionné dans un commentaire à la réponse de @brianegge, il n'y a pas beaucoup usecases pour le hachage avec plus de 32 bits et probablement pas un seul pour le hachage avec plus de 64 bits:
Je ne pouvais imaginer une énorme table de hachage distribuée à travers des dizaines de serveurs, peut-être stocker des dizaines de milliards de mappages. Pour un tel scénario, @brianegge a encore un point valide ici: 32 bits permettent de 2^32 (ca. 4,3 milliards de dollars) de différentes clés de hachage. En supposant un algorithme fort, vous devriez avoir très peu de collisions. Avec 64 bits (18,446,744,073 milliards de clés différentes) votre certainement gagner, quel que soit le scénario dingue vous en avez besoin pour. La pensée de usecases pour les clés 128 bits (340,282,366,920,938,463,463,374,607,431 milliard de clés possibles) est à peu près impossible et pourtant.
Combiner le hachage de plusieurs champs, il suffit de faire un XOR multiplier l'un par un premier et d'ajouter:
long hash = MyHash.hash(string1) * 31 + MyHash.hash(string2);
Le petit premier est là pour éviter l'égalité de code de hachage pour la commutation de valeurs, c'est à dire {'foo','bar'} et {'bar','foo'} ne sont pas égaux et doivent avoir un autre code de hachage. XOR est mauvaise car elle renvoie 0 si les deux valeurs sont égales. Par conséquent, {'toto','toto'} et {'bar','bar'} aurait le même code de hachage.