3

アプリケーションの一部にファイルを保存しています。同じファイルを多数追加する可能性があるため、最初に各ファイルのハッシュを保持します。2つのファイルが同じハッシュを持っている場合、1つを破棄し、そのファイルへの両方の「参照」が同じ物理ファイルを指します。

  1. ハッシュの衝突についてどのくらい心配する必要がありますか?

  2. 衝突の場合はどうすればいいですか?これまでの私のコードの核心は、同じハッシュを持つ2つの異なるファイルがないことに依存しています。現在衝突が発生した場合、私のアプリは合法的に異なるファイルをスローし、同じハッシュを持つファイルを指します。

  3. MD5以外のものを使用する必要がありますか?SHA-1の方が衝突率は高くなりますか?

4

3 に答える 3

4

非常に重要なアプリケーションを使用している場合を除き、ハッシュの衝突について心配する必要はありません。それらは非常にまれであるため、多くの場合、それらは起こらないと仮定されており、その仮定が一度でも間違っていると、壊滅的なことがこれらの事に起こります.

SHA1 は MD5 よりも大きな出力スペースを持っているため (また、SHA1 で知られている攻撃も少ない)、間違いなく悪い選択ではありません。誰かがあなたのハッシュを積極的に衝突させることを恐れている場合は、おそらく SHA-256 などの SHA の新しいバリアントを使用することをお勧めします。

于 2009-12-14T21:17:30.367 に答える
2

任意の 2 つのランダムに選択されたビットストリームのハッシュ間の衝突の可能性は、ハッシュが表す個別の状態の数に反比例します。そのため、64 ビットのハッシュは2 ** 64状態をエンコード1 / (2**64)し、ファイルのペアで衝突が発生する可能性があります。しかし、(大規模な) ファイルのセットで衝突が発生する可能性を本当に懸念しているため、「誕生日のパラドックス」計算を実行して、ペアごとの衝突の確率と予想されるファイル数を差し込む必要があります。

しかし、衝突の可能性が低いと数値が示していたとしても、比較を行わずにファイルを捨てることは安全ではないというのが結論だと思います。

于 2009-12-14T21:49:41.860 に答える
0

提供されたシナリオでは、心配する必要はありません。2 つの異なるドキュメントが同じでない限り、同じチェックサムを持つことはできません。これを想像してください:

変数 a = 1; 変数 b = 2;

b + 3 = 5; // そうですね!+ 3 != 5; // var a が 2 に等しくない限り、衝突は起こりません

2 以外の値を持つ var 'a' は、決して 5 に計算できないため、衝突は起こりません。一方向チェックサム ハッシュ アルゴリズムを使用している (または使用する必要がある) ため、結果のハッシュは常にその入力に依存します。

ハッシュの衝突は、ランダムに生成されたハッシュを扱っているときに発生します。ハッシュは、ランダムな未指定の入力のために衝突する可能性はほとんどありません。

一方向ハッシュ アルゴリズムが単純な加算によって達成されるとは決して推測していないことに注意してください。私は単純な例として足し算を使用しているだけです。これらは一連の値を取り、それらに基づいて異なるセット値を出力するという単純な概念に基づいています。

于 2014-02-02T01:27:27.317 に答える