JavaScript 用のシンプルな (安全でない) ハッシュ関数? [重複] 質問する

JavaScript 用のシンプルな (安全でない) ハッシュ関数? [重複] 質問する

重複の可能性あり:
Javascript/jQuery で文字列からハッシュを生成する

ブラウザ互換の JavaScript で書かれた、シンプルな (つまり、数百行ではなく数十行のコード) ハッシュ関数を提案してもらえませんか? 理想的には、文字列を入力として渡したときに、MD5、SHA1 などの一般的な出力である 32 文字の 16 進文字列に似たものを生成するものが欲しいです。暗号的に安全である必要はなく、衝突に対して適度に耐性があれば十分です。 (私の最初の使用例は URL ですが、将来的には他の文字列にも使用したいと思うでしょう。)

ベストアンサー1

私自身は確認していませんが、これを見るとJava の String.hashCode() メソッドの JavaScript 実装かなり短いようです。

このプロトタイプを使用すると、.hashCode()任意の文字列 (例: ) を呼び出すだけ"some string".hashCode()で、1395333309 などの数値ハッシュ コード (より具体的には、Java の同等のもの) を受け取ることができます。

String.prototype.hashCode = function() {
    var hash = 0;
    for (var i = 0; i < this.length; i++) {
        var char = this.charCodeAt(i);
        hash = ((hash<<5)-hash)+char;
        hash = hash & hash; // Convert to 32bit integer
    }
    return hash;
}

2022 編集:

長い間認められてきたのは、組み込みプロトタイプを変更するのは悪い習慣です代わりに、単純な関数を使用する必要があります。

/**
 * Returns a hash code from a string
 * @param  {String} str The string to hash.
 * @return {Number}    A 32bit integer
 * @see http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
 */
function hashCode(str) {
    let hash = 0;
    for (let i = 0, len = str.length; i < len; i++) {
        let chr = str.charCodeAt(i);
        hash = (hash << 5) - hash + chr;
        hash |= 0; // Convert to 32bit integer
    }
    return hash;
}

おすすめ記事