JavaScriptでコード共有するJAVA互換hashCodeアルゴリズムの実装_基礎知識
Java では、hashCode アルゴリズムを使用して文字列のハッシュ値を計算できます。今日、友人から、js で hashCode を計算できるかどうかを尋ねられました。計算結果は Java の hashCode 計算と同じである必要があります。
Java の hashCode については、これまでそのアルゴリズムを理解したことがありませんでしたが、それほど難しいものではないと思うので、テストのために Java で次のコードを作成しました。
実行結果: 899755
Ctrl キーを押して 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 を返します;
}
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ではそんな制限はありません。問題はここにあるはずなので、前のメソッドに少し変更を加えました。
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('瀋陽瀋陽'));
<スクリプト>
関数 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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです
