196


69

そこには多くのMD5 JavaScript実装があります。 誰が最も先進的で、最もバグが修正され、そして最も速いものがどれであるか知っていますか?

http://www.bruechner.de/md5file/js/[この]ツールに必要です。

14 Answer


150


Joseph’s Myersの実装は非常に速いと聞いたことがあります。 加えて、彼はJavascriptの最適化に関するhttps://web.archive.org/web/20170425230948/http://www.webreference.com:80/programming / javascript / jkm3 / index.html [長文の記事]を持っています。彼の実装を書いている間に学んだ。 パフォーマンスの高いJavaScriptに興味がある人にとっては、これは良い読み物です。

彼のMD5実装は こちらにあります。


61


この場合はCryptoJSを使用することをお勧めします。

基本的にCryptoJSは、ベストプラクティスとパターンを使用してJavaScriptに実装された、標準的で安全な暗号化アルゴリズムのコレクションです。 それらは高速であり、そしてそれらは一貫した単純なインターフェースを有する。

パスワード文字列のMD5ハッシュを計算したい場合は、次のようにします。

    var passhash = CryptoJS.MD5(password);

    $.post(
      'includes/login.php',
      { user: username, pass: passhash },
      onLogin,
      'json' );

そのため、このスクリプトはあなたのパスワード文字列のハッシュをサーバに送信します。

あなたが訪れることができる他のハッシュ計算アルゴリズムに関するさらなる情報とサポートのために:


25


ライブラリを選択しながら、Bowerなどの最新のフレームワークをサポートし、jslintを渡し、JQuery用のプラグインモデルをサポートするか、AMD / RequireJSなどのモジュールシステムをサポートするかを確認します。 これらの追加基準の一部または全部を満たすオプションがいくつかあります。

  • CryptoJS:これはおそらく、JSコードに大きな負担をかけることなく各アルゴリズムを個別に使用できる最も拡張的なライブラリです。 さらにUTF8、UTF16およびBase64用のエンコーダ/デコーダとして使用できます。 Bowerパッケージとして登録されている github repositoryとRequireJSでの使用方法の説明を維持しています。

  • Spark MD5:これは他の回答者が述べているJKMコードに基づいており、これもより速い実装です。 しかし、さらに、Sparkの実装はAMDのサポートを追加し、jslintに合格し、さらに増分モードを渡します。 Base64 o / pはありませんが、生のo / pはあります(つまり、 文字列の32ビットint配列の配列)

  • JQuery MD5 plugin:非常に単純なものですが、rawモードはありません。

  • JavaScript-MD5:Sparkほど派手ではないが高速ですが、より単純です。

CryptoJSからの例:

//just include md5.js from the CryptoJS rollups folder
var hash = CryptoJS.MD5( "メッセージ"); console.log(hash.toString());

http://jsperf.com/md5-shootout/7で上記のライブラリ間のパフォーマンス比較があります。 私のマシンでは(確かに古い)現在のテストはあなたがスピードを探しているならSpark MD5があなたの最善の策であることを示しています(そして普通のJKMコードもそうです)。 ただし、より包括的なライブラリをお探しの場合は、CryptoJSが最善の策ですが、Spark MD5よりも79%遅くなります。 しかし、CryptoJSがややアクティブなプロジェクトと同じ速度を達成することになると思います。


10


私はこの件に関していくつかの記事を見つけました。 彼ら全員がJoseph Meyersの実装を提案しました。

いくつかのテストについてはhttp://jsperf.com/md5-shootoutを参照してください。

私はこのコードを見た究極のスピードを求めて、私はそれが改善されることができるのを見ました。 そこで私はJoseph Meyersコードに基づいて新しいJSスクリプトを作成しました。

http://2basix.nl/page.php?al=javascript%20fast%20md5[Jospeh Meyers codeの改善]を参照してください。


7


MD5 =関数(e){関数h(a、b){var c、d、e、f、g; n = 1である。 e = a g ^ 2147483648 ^ e ^ f:c | d? g g ^ 3221225472 ^ e ^ f:g ^ 1073741824 ^ e ^ f:g ^ e ^ f}

関数k(a、b、c、d、e、f、g){a = h(a、h(h(b)

関数l(a、b、c、d、e、f、g){a = h(a、h(h(b)

関数m(a、b、d、c、e、f、g){a = h(a、h(h(b ^ d ^ c、e)、g)); hを返す(a << f | a >>> 32  -  f、b)}

関数n(a、b、d、c、e、f、g)} hを返す(a << f | a >>> 32  -  f、b)}

関数p(a){var b = ""、d = ""、c; (c = 0; 3> = c; c)d = a >>> 8 * c b = String.fromCharCode(c):(127 <c b = String.fromCharCode(c >> 6 | 192):(b = String.fromCharCode(c >> 12 | 224)、b = String.fromCharCode(c >> 6)


5


私は、型付き配列をサポートするHTML5ブラウザ(DataView、ArrayBufferなど)をサポートする必要があるだけです。私はJoseph Myersコードを取り、それをUint8Arrayでの受け渡しをサポートするように修正したと思います。 私はすべての改善を捉えたわけではありません、そしてまだ改善できるいくつかのchar()配列アーティファクトがまだあります。 PouchDBプロジェクトに追加するためにこれが必要でした。

var PouchUtils = {}; PouchUtils.Crypto = {}; (function(){PouchUtils.Crypto.MD5 = function(uint8Array){function md5cycle(x、k){var a = x [0]、b = x [1]、c = x [2]、d = x [ 3];

a = ff(a、b、c、d、k [0]、7、−680876936)。 d = ff(d、a、b、c、k [1]、12、−389564586)。 c = ff(c、d、a、b、k [2]、17、606105819)。 b = ff(b、c、d、a、k [3]、22、−1044525330)。 a = ff(a、b、c、d、k [4]、7、−176418897)。 d = ff(d、a、b、c、k [5]、12、1200080426)。 c = ff(c、d、a、b、k [6]、17、−1473231341)。 b = ff(b、c、d、a、k [7]、22、−45705983)。 a = ff(a、b、c、d、k [8]、7,1770035416)。 d = ff(d、a、b、c、k [9]、12、−1958414417)。 c = ff(c、d、a、b、k [10]、17、−42063)。 b = ff(b、c、d、a、k [11]、22、−1990404162)。 a = ff(a、b、c、d、k [12]、7,1804603682)。 d = ff(d、a、b、c、k [13]、12、−40341101)。 c = ff(c、d、a、b、k [14]、17、−1502002290)。 b = ff(b、c、d、a、k [15]、22,1236535329)。

a = gg(a、b、c、d、k [1]、5、−165796510)。 d = gg(d、a、b、c、k [6]、9、−1069501632)。 c = gg(c、d、a、b、k [11]、14,643717713)。 b = gg(b、c、d、a、k [0]、20、−373897302)。 a = gg(a、b、c、d、k [5]、5、−701558691)。 d = gg(d、a、b、c、k [10]、9、38016083)。 c = gg(c、d、a、b、k [15]、14、−660478335)。 b = gg(b、c、d、a、k [4]、20、−405537848)。 a = gg(a、b、c、d、k [9]、5、568446438); d = gg(d、a、b、c、k [14]、9、−1019803690)。 c = gg(c、d、a、b、k [3]、14、−187363961)。 b = gg(b、c、d、a、k [8]、20、1163531501)。 a = gg(a、b、c、d、k [13]、5、−1444681467)。 d = gg(d、a、b、c、k [2]、9、−51403784)。 c = gg(c、d、a、b、k [7]、14,1735328473)。 b = gg(b、c、d、a、k [12]、20、−1926607734)。

a = hh(a、b、c、d、k [5]、4、−378558)。 d = hh(d、a、b、c、k [8]、11、−2022574463)。 c = hh(c、d、a、b、k [11]、16、1839030562)。 b = hh(b、c、d、a、k [14]、23、−35309556)。 a = hh(a、b、c、d、k [1]、4、−1530992060)。 d = hh(d、a、b、c、k [4]、11、1272893353)。 c = hh(c、d、a、b、k [7]、16、−155497632)。 b = hh(b、c、d、a、k [10]、23、−1094730640)。 a = hh(a、b、c、d、k [13]、4,681279174)。 d = hh(d、a、b、c、k [0]、11、−358537222)。 c = hh(c、d、a、b、k [3]、16、−722521979)。 b = hh(b、c、d、a、k [6]、23、76029189)。 a = hh(a、b、c、d、k [9]、4、−640364487)。 d = hh(d、a、b、c、k [12]、11、−421815835)。 c = hh(c、d、a、b、k [15]、16,530742520)。 b = hh(b、c、d、a、k [2]、23、−995338651)。

a = ii(a、b、c、d、k [0]、6、−198630844)。 d = ii(d、a、b、c、k [7]、10,1126891415)。 c = ii(c、d、a、b、k [14]、15、−1416354905)。 b = ii(b、c、d、a、k [5]、21、−57434055)。 a = ii(a、b、c、d、k [12]、6,1700485571)。 d = ii(d、a、b、c、k [3]、10、−1894986606)。 c = ii(c、d、a、b、k [10]、15、−1051523)。 b = ii(b、c、d、a、k [1]、21、−2054922799)。 a = ii(a、b、c、d、k [8]、6,1873313359)。 d = ii(d、a、b、c、k [15]、10、−30611744)。 c = ii(c、d、a、b、k [6]、15、−1560198380)。 b = ii(b、c、d、a、k [13]、21,1309151649)。 a = ii(a、b、c、d、k [4]、6、−145523070)。 d = ii(d、a、b、c、k [11]、10、−1120210379)。 c = ii(c、d、a、b、k [2]、15,718787259)。 b = ii(b、c、d、a、k [9]、21、-343485551);

x [0] = add32(a、x [0]); x [1] = add32(b、x [1]); x [2] = add32(c、x [2]); x [3] = add32(d、x [3]);

}

関数cmn(q、a、b、x、s、t){a = add32(add32(a、q)、add32(x、t))。 add32((a << s)|(a >>>(32  -  s))、b)を返します。 }

関数ff(a、b、c、d、x、s、t){cmnを返す((b

関数gg(a、b、c、d、x、s、t){cmnを返す((b

関数hh(a、b、c、d、x、s、t){return cmn(b ^ c ^ d、a、b、x、s、t); }

関数ii(a、b、c、d、x、s、t){return cmn(c ^(b |(〜d))、a、b、x、s、t); }

関数md51(s){txt = ''; var n = s.length、state = [1732584193、-271733879、-1732584194、271733878]、i; (i = 64; i <= s.length; i = 64){md5cycle(state、md5blk(s.subarray(i  -  64、i))); } s = s.subarray(i  -  64); var tail = [0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0]; (i = 0; i <s。length; i)tail [i >> 2] | = s [i] <<(((i%4)<< 3); tail [i >> 2] | = 0x80 <<(((i%4)<< 3); if(i> 55){md5cycle(state、tail); (i = 0; i <16; i)に対してtail [i] = 0; tail [14] = n * 8; md5cycle(状態、末尾)。状態を返す。 }

/ *ここでUnicodeをサポートする必要があります。
         *  MD-5を再定義できるとは思わない限り
         *  マルチバイト文字用のアルゴリズム(おそらく
         *  4つの16ビット文字をすべて追加して
         *  合計を32ビットに短縮します。 さもないと
         *  すべてのキャラクターのようにMD-5を演奏することをお勧めします
         *  2バイトだった -  0040 0025 = @%など。
         *  通常のMD-5合計はどのように一致しますか?
         *  テキストを何かに標準化する方法はありません
         *  変換前のUTF-8と同じです。スピードコストは
         *  まったく禁止されています。 JavaScript標準
         *  それ自体がこれを見る必要があります。それは始まるべきです
         *  事前形成されたUTF-8として文字列へのアクセスを提供する
         *  8ビット符号なし値配列 * / function md5blk(s){/ *グローバルが早いと考えました。 * / var md5blks = []、i; / *アンディキングはこうやりました。 * /(i = 0; i <64; i = 4){md5blks [i >> 2] = s [i]
                + (s[i + 1] << 8)
                + (s[i + 2] << 16)
                + (s[i + 3] << 24);
md5blksを返します。 }

var hex_chr = '0123456789abcdef'.split(' ');

関数rhex(n){var s = ''、j = 0; (; j <4; j)s = hex_chr [(n >>(j * 8 4))の場合
                + hex_chr[(n >> (j * 8)) & 0x0F];
sを返します。 }

関数hex(x){(var i = 0; i <x。length; i)についてx [i] = rhex(x [i]); x.join( '')を返します。 }

関数md5(s){hex(md51(s))を返します。 }

関数add32(a、b){return(a b)

md5(uint8Array)を返します。 ; ();


5


現在最も高速なmd5の実装(Joseph Myersのコードに基づく):

jsPerf比較:http://jsperf.com/md5-shootout/63


5


ここで述べたほとんどのMD5実装を含む、いくつかのJavaScriptハッシュ実装を比較するテストを書きました。 テストを実行するには、http://brillout.github.io/test-javascript-hash-implementations/にアクセスして少し待ってください。

https://stackoverflow.com/questions/1655769/fastest-md5-implementation-in-javascript/24210406#24210406[Rのhttps://stackoverflow.com/a/24210406/270274[YaMD5]実装。 Hill's answer]が最速です。


3


高速でUnicode文字列をサポートする実装を見つけることができなかったことは私を悩ませた。

ですから私はUnicode文字列をサポートし、現在でも最速のASCIIのみの文字列の実装よりも 表示時間を表示するものを作成しました。

Joseph Myersのコードに基づいていますが、TypedArraysを使用しており、その他にも改良が加えられています。


1


SHA256について説明したように、グラフィックカードで計算する(WebGLでハッシュアルゴリズムを実装する)ことで、はるかに高速なハッシュが可能になります。ユーザのビデオを使用してブラウザ内で[ユーザのビデオカードを使用してブラウザ内でsha256ハッシュを計算することは可能ですか WebGLまたはFlashを使用して?