Javaでは、ハッシュコードアルゴリズムを使用して、文字列のハッシュ値を計算できます。今日、友人が突然JSでハッシュコードを計算できるかどうかを尋ねました。要件はJavaのハッシュコード計算結果と同じです。
Javaのハッシュコードのアルゴリズムをこれまで理解したことはありませんでしたが、おそらくそれほど難しくないでしょう。そこで、私はこのコードをJavaでテストのために書きました。
実行結果:899755
CTRLキーを押して、ハッシュコードメソッド名をクリックしてフォローアップし、そのアルゴリズムを確認します。以下に示すように、それはいくつかの簡単なコード文であることがわかりました。
コードコピーは次のとおりです。
public int hashcode(){
int h = hash;
if(h == 0){
int off = offset;
char val [] = value;
int len = count;
for(int i = 0; i <len; i ++){
h = 31*h+val [off ++];
}
ハッシュ= h;
}
hを返します。
}
これで、JSに移植するだけでも大丈夫です。だから私は次のJSコードを書きました:
コードコピーは次のとおりです。
<script type = "text/javascript">
関数ハッシュコード(str){
var h = 0、off = 0;
var len = str.length;
for(var i = 0; i <len; i ++){
h = 31 * h+str.charcodeat(off ++);
}
hを返します。
}
Alert(HashCode( 'Shekenyang'));
</script>
実行結果:899755
OK、Java計算結果と同じです。私はこれが行われると思ったので、それをテストするために文字列を見つけることを考えました:
「シェニヤン、シェニヤン」、Javaでの実行の結果は1062711668ですが、JSの26832515444になります。
私はとてもひどいです、この1回の試みに問題があります!しばらく考えた後、私は突然、JavaのINTの長さが約21億であるように見えることに気付き、JSにはそのような制限がないことに気付きました。問題はここにあるはずなので、前の方法にいくつかの変更を加えました。
コードコピーは次のとおりです。
<スクリプト>
関数ハッシュコード(str){
var h = 0、off = 0;
var len = str.length;
for(var i = 0; i <len; i ++){
h = 31 * h+str.charcodeat(off ++);
}
var t = -2147483648*2;
while(h> 2147483647){
H+= t
}
hを返します。
}
Alert(hashcode( 'shekenyang shenyang')); </script>
もう一度テスト!わかりました!ミッションは行われます。技術的なコンテンツはありませんが、ちょっとした要約
2013-02-19に更新された上記のものは比較的非効率的であり、コンテンツが非常に長いときに払拭されます。次のコードは最適化されたコードです。
コードコピーは次のとおりです。
<スクリプト>
関数ハッシュコード(str){
var h = 0;
var len = str.length;
var t = 2147483648;
for(var i = 0; i <len; i ++){
h = 31 * h + str.charcodeat(i);
if(h> 2147483647)h%= t; // java intオーバーフローモジュールを取得する
}
/ * var t = -2147483648 * 2;
while(h> 2147483647){
H += t
}*/
hを返します。
}
alert(hashcode( 'c#同時にnスレッドを同時に実行する方法、残りはキューに実装されます')); // 1107373715
</script>