web-dev-qa-db-ja.com

どのチェックサムアルゴリズムを使用する必要がありますか?

バイトの塊が更新されたかどうかを見つけることができる必要があるシステムを構築しています。ブロブ全体(最大5MBまで可能)を保存するのではなく、そのチェックサムを計算し、これを保存して、少し後で同じチェックサムを計算して、ブログが更新されたかどうかを確認する必要があると考えています。

目標は、以下を(この順序で)最小化することです。

  • チェックサムのサイズ
  • 計算する時間
  • 衝突の可能性(コンテンツが変更されていても2つの同一のチェックサムが発生する)。

システムの衝突が1/1,000,000以下であっても問題ありません。懸念はセキュリティではなく、単に更新/エラー検出であるため、まれな衝突は問題ありません。 (これが最小化するために最後に置いた理由です)。

また、テキストのblobを自分で変更することはできません。

もちろん、 md5crcまたはsha1思い浮かびます。もし私が迅速な解決策を望んでいたなら、私はそれを選びます。しかし、迅速な解決策よりも、私は何ができるかを探しています長所と短所だけでなく異なる方法の比較

52

this SO page 、CRC vs MD5/SHA1をご覧になることをお勧めします。
速度と衝突については、 この他のスレッド で説明しています。
そしていつものように Wikipedia はあなたの友達です。

私が選択しなければならなかった場合、答える重要な質問があります:いずれにせよ衝突がありませんか-または、少なくとも、月が地球と衝突する可能性に近いほど低い確率であることを望みます5分以内に?

「はい」の場合、SHAファミリーを選択します。
あなたの場合、更新チェックの実行方法を変更します。
たとえば、増分番号をBLOBに関連付けて、hashrequest for update番号が反対側で異なる場合に必要になります。この場合の衝突確率は、〜10 ^ -18から〜0(基本的に0 +bug potential)...

編集以下のコメント

このアルゴリズム、Alder-32が見つかりました。これは、32ビットのCRC、つまり約1/10 ^ 9(MD5は128ビットの長さ)の長いメッセージ(MB)に適しています。
計算は高速です。
Adler-32 。下部にいくつかのサンプル(リンク)があります。

26
Ring Ø

Blake2は、使用できる最速のハッシュ関数であり、主に採用されています。

BLAKE2は、他の優れたハッシュ関数よりも高速であるだけでなく、MD5またはSHA-1よりも高速です Source

SHA-3コンテストの勝者はKeccakアルゴリズムでしたが、GNU/Linuxディストリビューションではデフォルトで採用されていない人気のある実装はまだありません。代わりに、SHA-3コンテスト候補であったBlake2はKeccakよりも高速で、 GNU coreutils の一部です。したがって、GNU/Linuxディストリビューションでは、b2sum Blake2ハッシュアルゴリズムを使用します。

1
noraj