web-dev-qa-db-ja.com

JavaScript用の単純な(非セキュア)ハッシュ関数?

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

(ブラウザ互換の)JavaScriptで記述された単純な(数百行ではなく数十行の)ハッシュ関数を提案できますか?入力として文字列を渡すと、MD5、SHA1などの一般的な出力である32文字の16進数文字列に似たものを生成するものが理想的です。 。 (私の最初のユースケースはURLですが、将来的には他の文字列でも使用したいと思うでしょう。)

108
mjs

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

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

String.prototype.hashCode = function() {
    var hash = 0;
    if (this.length == 0) {
        return hash;
    }
    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;
}
111
Barak

JSで記述されたハッシュ関数の多くの実現があります。例えば:

セキュリティが必要ない場合は、ハッシュ関数ではなく、出力を固定せず、ユーザーが簡単にデコードできるbase64を使用することもできますが、より軽量で、値を隠すために使用できます: http: //www.webtoolkit.info/javascript-base64.html

8
silex

単純なオブジェクトハッシュ:

(function () {
    Number.prototype.toHex = function () {
        var ret = ((this<0?0x8:0)+((this >> 28) & 0x7)).toString(16) + (this & 0xfffffff).toString(16);
        while (ret.length < 8) ret = '0'+ret;
        return ret;
    };
    Object.hashCode = function hashCode(o, l) {
        l = l || 2;
        var i, c, r = [];
        for (i=0; i<l; i++)
            r.Push(i*268803292);
        function stringify(o) {
            var i,r;
            if (o === null) return 'n';
            if (o === true) return 't';
            if (o === false) return 'f';
            if (o instanceof Date) return 'd:'+(0+o);
            i=typeof o;
            if (i === 'string') return 's:'+o.replace(/([\\\\;])/g,'\\$1');
            if (i === 'number') return 'n:'+o;
            if (o instanceof Function) return 'm:'+o.toString().replace(/([\\\\;])/g,'\\$1');
            if (o instanceof Array) {
                r=[];
                for (i=0; i<o.length; i++) 
                    r.Push(stringify(o[i]));
                return 'a:'+r.join(';');
            }
            r=[];
            for (i in o) {
                r.Push(i+':'+stringify(o[i]))
            }
            return 'o:'+r.join(';');
        }
        o = stringify(o);
        for (i=0; i<o.length; i++) {
            for (c=0; c<r.length; c++) {
                r[c] = (r[c] << 13)-(r[c] >> 19);
                r[c] += o.charCodeAt(i) << (r[c] % 24);
                r[c] = r[c] & r[c];
            }
        }
        for (i=0; i<r.length; i++) {
            r[i] = r[i].toHex();
        }
        return r.join('');
    }
}());

ここで重要なのは、任意のオブジェクトを一意の文字列に変換する文字列化器です。 hashCodeはオブジェクトに対して実行され、文字列化されたオブジェクトの文字をハッシュします。

余分なポイントについては、文字列をエクスポートしてパーサーを作成します。

3
Fordi

この記事 では、単純なハッシュ関数 について詳細に説明し、かなり簡単なサンプルコード(Cで)を提供しています。 ボブ・ジェンキンスのハッシュ関数 はあなたのニーズに適しているようです(この ドブス博士の記事 詳細と他のハッシュ関数の調査がありますが、どちらも役立つ可能性があります)。

3
Tom

これらの実装を確認してください

3
Stefan Filip
// Simple but unreliable function to create string hash by Sergey.Shuchkin [t] gmail.com
// alert( strhash('http://www.w3schools.com/js/default.asp') ); // 6mn6tf7st333r2q4o134o58888888888
function strhash( str ) {
    if (str.length % 32 > 0) str += Array(33 - str.length % 32).join("z");
    var hash = '', bytes = [], i = j = k = a = 0, dict = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','1','2','3','4','5','6','7','8','9'];
    for (i = 0; i < str.length; i++ ) {
        ch = str.charCodeAt(i);
        bytes[j++] = (ch < 127) ? ch & 0xFF : 127;
    }
    var chunk_len = Math.ceil(bytes.length / 32);   
    for (i=0; i<bytes.length; i++) {
        j += bytes[i];
        k++;
        if ((k == chunk_len) || (i == bytes.length-1)) {
            a = Math.floor( j / k );
            if (a < 32)
                hash += '0';
            else if (a > 126)
                hash += 'z';
            else
                hash += dict[  Math.floor( (a-32) / 2.76) ];
            j = k = 0;
        }
    }
    return hash;
}
1
Sergey Shuchkin

これを確認してください JavaScriptのMD5実装 。そのBSDライセンスと本当に使いやすい。例:

md5 = hex_md5("message to digest")
0
jsalonen