Dans Java, un algorithme de code de hash peut être utilisé pour calculer la valeur de hachage d'une chaîne. Aujourd'hui, un ami m'a soudainement demandé si je pouvais calculer HashCode dans JS, et l'exigence est la même que le résultat de calcul de la code HashCode de Java.
Je n'ai jamais compris l'algorithme du code de hash de Java jusqu'à présent, mais ce ne sera probablement pas trop difficile. J'ai donc écrit ce code en Java pour les tests:
Résultat de course: 899755
Appuyez sur la touche CTRL et cliquez sur le nom de la méthode HashCode pour suivre et consultez son algorithme. J'ai trouvé que ce sont quelques phrases de code simples, comme indiqué ci-dessous:
La copie de code est la suivante:
public int hashcode () {
int h = hachage;
if (h == 0) {
int off = offset;
char Val [] = valeur;
int len = count;
pour (int i = 0; i <len; i ++) {
h = 31 * h + val [off ++];
}
hash = h;
}
retour h;
}
Maintenant, ça devrait être OK si vous le portez simplement sur JS. J'ai donc écrit le code JS suivant:
La copie de code est la suivante:
<script type = "text / javascript">
fonction hashcode (str) {
var h = 0, off = 0;
var len = str.length;
pour (var i = 0; i <len; i ++) {
h = 31 * H + str.charcodeat (off ++);
}
retour h;
}
alert (hashcode ('shenyang'));
</cript>
Résultat de course: 899755
Ok, le même que le résultat de calcul Java. Je pensais que ce serait fait, puis j'ai pensé à trouver une chaîne pour le tester:
"Shenyang, Shenyang", le résultat de la course en Java est: 1062711668, mais il devient: 26832515444 en js.
Je suis tellement terrible, il y a un problème avec ce seul essai! Après avoir réfléchi un instant, j'ai soudainement réalisé que la longueur d'intm en Java semble être d'environ 2,1 milliards, et il n'y a pas de restriction de ce type en JS. Le problème devrait être ici, j'ai donc apporté quelques modifications à la méthode précédente:
La copie de code est la suivante:
<cript>
fonction hashcode (str) {
var h = 0, off = 0;
var len = str.length;
pour (var i = 0; i <len; i ++) {
h = 31 * H + str.charcodeat (off ++);
}
var t = -2147483648 * 2;
tandis que (h> 2147483647) {
h + = t
}
retour h;
}
alert (hashcode ('shenyang shenyang')); </cript>
Testez à nouveau! D'ACCORD! La mission est terminée. Pas de contenu technique, un peu de résumé
Mis à jour le 2013-02-19, celui ci-dessus est relativement inefficace et sera dissipé lorsque le contenu est très long. Le code suivant est le code optimisé:
La copie de code est la suivante:
<cript>
fonction hashcode (str) {
var h = 0;
var len = str.length;
var t = 2147483648;
pour (var i = 0; i <len; i ++) {
h = 31 * H + str.charcodeat (i);
if (h> 2147483647) h% = t; // java int déborde pour prendre le module
}
/ * var t = -2147483648 * 2;
tandis que (h> 2147483647) {
h + = t
} * /
retour h;
}
alert (hashcode ('c # comment exécuter n threads dans simultanément en même temps, les autres sont implémentés dans la file d'attente')); // 1107373715
</cript>