Java では、hashCode アルゴリズムを使用して文字列のハッシュ値を計算できます。今日、友人から、js で hashCode を計算できるかどうかを尋ねられました。計算結果は Java の hashCode 計算と同じである必要があります。
Java の hashCode については、これまでそのアルゴリズムを理解したことがありませんでしたが、それほど難しいものではないと思うので、テストのために Java で次のコードを作成しました。
実行結果: 899755
Ctrl キーを押して hashCode メソッド名をクリックしてアルゴリズムを確認してみると、以下に示すように非常に単純なコードであることがわかりました。
public int hashCode() {
int h = ハッシュ;
if (h == 0) {
int off = オフセット;
char val[] = 値;
int len = count;
for (int i = 0; i
h = 31*h val[off];
}
ハッシュ = h;
}
h を返します;
}
さて、これを js に移植するだけで問題ありません。そこで、次の JS コードを書きました:
<スクリプトタイプ="text/javascript">
関数ハッシュコード(str){
var h = 0、off = 0;
var len = str.length;
for(var i = 0; i
h = 31 * h str.charCodeAt(off);
}
return h;
}
alert(hashCode('瀋陽'));
実行結果: 899755
OK、結果は Java の計算と同じです。これで完了したと思い、次にテストするランダムな文字列を見つけようと考えました:
「Shenyang シェンヤン」、JAVA での実行結果は 1062711668 ですが、JS では 26832515444 になります。
めまいがするので、これを試してみると何かが間違っています!しばらく考えてふと思ったのですが、Javaではintの長さは21億くらいらしいのですが、jsではそんな制限はありません。問題はここにあるはずなので、前のメソッドに少し変更を加えました。
<スクリプト>
関数ハッシュコード(str){
var h = 0、off = 0;
var len = str.length;
for(var i = 0; i
h = 31 * h str.charCodeAt(off);
}
var t=-2147483648*2;
While(h>2147483647){
h =t
}
return h;
}
alert(hashCode('瀋陽瀋陽'));
もう一度テストしてください!わかりました!これで完了です。技術的な内容はなく、簡単な概要のみです
2013 年 2 月 19 日に更新されました。上記のコードは比較的効率が悪く、コンテンツが非常に長い場合にクラッシュします。次のコードは最適化されたコードです:
コードをコピー コードは次のとおりです:
<スクリプト>
関数 hashCode(str) {
var h = 0;
var len = str.length;
var t = 2147483648;
for (var i = 0; i
h = 31 * h str.charCodeAt(i);
If(h > 2147483647) h %= t;//Java int がオーバーフローした場合、剰余
を取得します
}
/*var t = -2147483648 * 2;
ながら (h > 2147483647) {
h = t
}*/
return h;
}
alert(hashCode('C# 同時に実行する N 個のスレッドと残りをキューに実装する方法')); //1107373715