ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptでコード共有するJAVA互換hashCodeアルゴリズムの実装_基礎知識

JavaScriptでコード共有するJAVA互換hashCodeアルゴリズムの実装_基礎知識

WBOY
WBOYオリジナル
2016-05-16 16:39:361941ブラウズ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。