2013-04-25 8 views
5

私は、JavaScriptで実装された衝突の少ない高速ハッシュを探しています。暗号ハッシュである必要はありません。私は基本的には、指定されたファイルがすでにアップロードされているか(または部分的にアップロードされている)ユーザーのアカウントにアップロードされているかどうかを確認する方法として、大規模な(ビデオ)ファイルにアップロード時間を保存しています。ファイルのJavaScriptの低衝突の非暗号ハッシュ

新しいHTML5 File APIを使用して、ファイルのスライスを読み込んでいます。私はSparkMD5にこれを渡して、私にファイルのハッシュを与えます。私はSparkMD5を使ってインクリメンタルハッシュを行うことができるので、メモリ内のすべてを読み取る必要はありません。

全体としてSparkMD5は私のニーズに対応していますが、大きなファイルの場合はハッシュを取得するまでに時間がかかります(300MBファイルの場合は約30秒)。私はこれを減らすのが理想的です。私はハッシュ関数に精通していないので、何かを移植するつもりはなく、すでに実装されているライブラリを理想的に探しています。

+1

何許容期間をだろうか?あなたはMD32よりも高速であることが意図されているCRC32を見ることができますが、目立たないかもしれませんし、おそらくより高い衝突率を得るでしょう。 – Graham

+0

さて、私はCRC32を見ましたが、衝突率は%0.4と読んでいます。私はこれが本当であるかどうかを知るのに十分な知識はありませんが、衝突率が高いことを示す他のものもあるようです。 –

+0

あなたの質問に答えるために、私は理想的には1GBファイルでも数秒かかると思っています。それが現実的かどうかは分かりません。 –

答えて

1

I benchmarked様々なハッシュアルゴリズム、およびここでは私が見つけた最速のオプションです:

  • をあなただけiMurmurHashを使用し、32ビットのダイジェストが必要な場合。これは約2 ** 14(16,000)ハッシュ後の衝突を与えることに注意してください。

  • 32ビット以上必要な場合は、SparkMD5を使用してください。私は高速の64または128ビットMurmurの実装を見つけませんでしたが、SparkMD5は驚くほど高速でした(75 MB /秒)。

    • あなたが増分更新が必要な場合はSparkMD5の段階的なハッシュは、いくつかの適度なオーバーヘッドに苦しむように見えるように、SparkMD5にそれらを供給する前に、より大きなチャンクに文字列を連結することを検討してください。

これらの推奨事項は、純粋なJavaScriptのためのものです。私はそれらを文字列でベンチマークしましたが、SparkMD5もArrayBuffersを取ります。


あなたはノード上の高速ハッシュモジュールをしたい場合は、あなたの最良のオプションは多少異なります。

  • あなたがバッファをハッシュしている場合:MD5アルゴリズムでビルトインcryptoモジュールを使用してください。

    • これに例外はある:あなたは、段階的なハッシュを必要としない場合は、あなたがmurmurhash-nativeを使用し、あなたはネイティブNPMの依存関係を持つOKです以上500メガバイト/秒のスループット、を必要とし、いくつかの追加のパフォーマンスのために。私は128ビット未満のダイジェストサイズをテストしませんでした。たとえ128ビットであっても、ハッシングが非常に速く、ボトルネックになる可能性は低いからです。

      (そのmurmurhashネイティブのは技術的に段階的なハッシュをサポートしていますが、それはノードの内蔵MD5アルゴリズムこのモードではより遅いです注意してください。)

  • あなたは非インクリメンタル単一の文字列をハッシュしている場合は、変換 それをバッファーに置き換え、前述の箇条書きを参照してください。

  • あなたはインクリメンタルに文字列をハッシュしている場合:

    • をあなたは32ビットのみ、使用iMurmurHashが必要な場合。これは約2 ** 14(16,000)ハッシュ後の衝突を与えることに注意してください。

    • 32ビットを超える必要がある場合:MD5アルゴリズムで内蔵の暗号モジュールを使用します。

      • 私はまた、文字列が暗黙のうちにあなたが暗号モジュールに渡す際にバッファに変換され、各バッファの作成が非常に遅いされているので、あなたは、より大きな塊に一緒に文字列を結合して実験することをお勧めします。ネイティブハッシュ関数は非常に高速であるため、パフォーマンスは一般的に、バッファの作成と文字列の結合によってボトルネックになります。
+0

iMurmerHashをよく知っておきましょう。 SparkMD5の約2倍の速さのようです。元の投稿が300MB/30秒になっている間に、あなたは75MB /秒を得ていると述べました。私が小さいチャンク(あなたが言及したオーバーヘッド)または遅いコンピュータ(私の質問は4年前からであった)のために遅いかどうかは分かりません。 –

+0

私のベンチマークの塊は非常に小さく、わずか数バイトなので、コンピュータの速度が遅く、JavaScriptエンジンが遅いと思います。 –

関連する問題