D'après la documentation de Java, le [code de hachage](http://java.sun.com/javase/6/docs/api/java/lang/String.html#hashCode()) pour un String
est calculé comme suit :
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
en utilisant
int
arithmétique, oùs[i]
est le i e caractère de la chaîne,n
est la longueur de la chaîne, et^
indique une exponentiation.
Pourquoi 31 est-il utilisé comme multiplicateur ?
Je comprends que le multiplicateur doit être un nombre premier relativement grand. Alors pourquoi pas 29, ou 37, ou même 97 ?
1 votes
Comparez également stackoverflow.com/questions/1835976/ - Je pense que 31 est un mauvais choix si vous écrivez vos propres fonctions hashCode.
10 votes
Si c'était 29, ou 37, ou même 97, vous demanderiez "pourquoi pas 31 ?".
2 votes
@EJP il est important de connaître la raison derrière le choix d'un numéro, à moins que ce numéro ne soit le résultat d'un tour de magie noire.
0 votes
Un article de blog de @peter-lawrey à ce sujet est disponible ici : vanilla-java.github.io/2018/08/12/ et ici : vanilla-java.github.io/2018/08/15/
1 votes
@DushyantSabharwal Ce que je veux dire, c'est qu'il aurait pu a été 29 ou 37 ou 97, ou 41, ou beaucoup d'autres valeurs, sans que cela fasse une grande différence dans la pratique. Nous utilisions 37 en 1976.