Maison > Java > javaDidacticiel > Pourquoi « String.hashCode() » de Java utilise-t-il 31 comme multiplicateur ?

Pourquoi « String.hashCode() » de Java utilise-t-il 31 comme multiplicateur ?

Mary-Kate Olsen
Libérer: 2024-12-19 10:46:11
original
656 Les gens l'ont consulté

Why Does Java's `String.hashCode()` Use 31 as its Multiplier?

Pourquoi hashCode() de Java dans String utilise 31 comme multiplicateur

En Java, la méthode hashCode() pour les objets String utilise ce qui suit formule :

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
Copier après la connexion

où s[i] est le ième caractère, n est la longueur de la chaîne et ^ désigne une exponentiation. Cela soulève la question : pourquoi 31 est-il spécifiquement choisi comme multiplicateur ?

Justification d'un multiplicateur premier

La documentation suggère d'utiliser un nombre premier relativement grand comme multiplicateur pour minimiser les collisions dans les tables de hachage. Des collisions se produisent lorsque des objets distincts produisent le même code de hachage, ce qui peut entraîner des problèmes de performances. Les nombres premiers offrent une meilleure répartition des codes de hachage, réduisant ainsi le risque de collisions.

Pourquoi pas d'autres nombres premiers ?

La sélection de 31 parmi d'autres nombres premiers est attribuée à deux facteurs :

  1. Prévention des débordements : Si le multiplicateur était pair et que la multiplication débordait, les informations seraient être perdu. En effet, multiplier par 2 équivaut à une opération de décalage.
  2. Optimisation des performances : La valeur 31 permet une optimisation où la multiplication peut être remplacée par un décalage et une soustraction : 31 * i = = (je ≪≪ 5) - je. Les machines virtuelles modernes effectuent cette optimisation automatiquement.

Par conséquent, 31 satisfait aux deux critères d'être un nombre premier pour éviter les collisions tout en permettant des opérations de hachage efficaces pour les objets String en Java.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal