Maison  >  Article  >  interface Web  >  Implémentation du partage de code de l'algorithme hashCode compatible JAVA dans les connaissances javascript_Basic

Implémentation du partage de code de l'algorithme hashCode compatible JAVA dans les connaissances javascript_Basic

WBOY
WBOYoriginal
2016-05-16 16:39:361972parcourir

En Java, un algorithme hashCode 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 en js. Le résultat du calcul doit être le même que le calcul hashCode de Java.

En ce qui concerne le hashCode de Java, je n'ai jamais compris son algorithme auparavant, mais je suppose que cela ne devrait pas être trop difficile, alors maintenant j'ai écrit ce code en Java pour le tester :
Résultat courant : 899755

Appuyez sur la touche Ctrl et cliquez sur le nom de la méthode hashCode pour suivre et jeter un œil à l'algorithme. J'ai trouvé qu'il s'agissait d'un code très simple, comme indiqué ci-dessous :

Copier le code Le code est le suivant :

public int hashCode() {
int h = hachage;
si (h == 0) {
int off = décalage ;
char val[] = valeur;
int len ​​​​= count;

pour (int i = 0; i < len; i ) {
h = 31*h val[off];
>
hachage = h;
>
retourner h;
>

D'accord maintenant, transplantez-le simplement dans js et ça devrait aller. J'ai donc écrit le code JS suivant :

Copier le code Le code est le suivant :



Résultat courant : 899755

OK, le résultat est le même que le calcul Java. Je pensais que c'était fait, puis j'ai pensé à trouver une chaîne aléatoire à tester :

"Shenyang Shenyang", le résultat en JAVA est : 1062711668, mais en js il devient : 26832515444.

J'ai tellement le vertige, il y a quelque chose de mal à essayer ça ! Après avoir réfléchi un instant, j'ai soudainement pensé que la longueur de int en Java semble être d'environ 2,1 milliards, mais qu'il n'y a pas de telle limite en js. Le problème devrait être là, j'ai donc apporté une petite modification à la méthode précédente :

Copier le code Le code est le suivant :

<script><br> fonction hashCode(str){<br> var h = 0, off = 0;<br>         var len = str.length;<br> pour(var je = 0; je < len; je ){<br />                h = 31 * h str.charCodeAt(off);<br />          }<br /> vart=-2147483648*2;<br /> Pendant que(h>2147483647){<br> h =t<br> ><br>          retour h ;<br> ><br> alert(hashCode('Shenyang Shenyang'));</script>

Testez à nouveau ! D'ACCORD! Vous avez terminé. Il n'y a pas de contenu technique, juste un bref résumé
Mis à jour le 19/02/2013, celui ci-dessus est relativement inefficace et plantera lorsque le contenu est très long. Le code suivant est le code optimisé :
.

Copier le code Le code est le suivant :

<script><br> Fonction hashCode(str) {<br>      var h = 0;<br> var len = str.length;<br> var t = 2147483648;<br> pour (var je = 0; je < len; je ) {<br />               h = 31 * h str.charCodeAt(i);<br /> If(h > 2147483647) h %= t;//Si java int déborde, prends le modulo<br> ><br> /*var t = -2147483648 * 2;<br>             while (h > 2147483647) {<br>              h = t<br> }*/<br>         retour h ;<br> ><br> alert(hashCode('C# Comment implémenter N threads s'exécutant simultanément et le reste dans la file d'attente')); </script>

Déclaration:
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