3

ユーザーがコンテンツをアップロードできるサイトを構築しています。相変わらず世界制覇を目指しているので、同じファイルを2度保存するのは避けたいところです。たとえば、ユーザーが同じファイルを 2 回アップロードしようとした場合 (名前を変更するか、過去に行ったことを単に忘れて)。

私の現在のアプローチは、アップロードされた各ファイルを追跡するデータベースに、各ファイルに関する次の情報を保存することです。

  • ファイル サイズ (バイト)
  • ファイル内容の MD5 サム
  • ファイル内容の SHA1 合計

次に、これら 3 つの列の一意のインデックスです。2 つのハッシュを使用して、誤検知のリスクを最小限に抑えます。

だから、私の質問は本当に:同じサイズの 2 つの異なる (「実世界の」) ファイルが同一の MD5およびSHA1 ハッシュを持つ確率はどれくらいですか?

または:同様の(非)複雑さのよりスマートな方法はありますか?

(確率はファイルサイズに依存する可能性があることを理解しています)。

ありがとう!

4

3 に答える 3

6

同じサイズの2つの実際のファイルが同じSHA1ハッシュを持つ確率は、すべての実用的な目的でゼロです。SHA1にはいくつかの弱点がありますが、SHA1ハッシュとサイズからファイルを作成すると、(1)計算能力の点で非常にコストがかかり、(2)ガベージまたは元のファイルが生成されます。

ミックスにMD5を追加することは、完全にやり過ぎです。SHA-1を信頼しない場合は、SHA-2に切り替えることをお勧めします。

本当にパラノイアの場合は、同じ(サイズ、SHA1)署名を持つファイルを比較してみてください。ただし、両方のファイル等しい場合は、両方のファイルを完全に読み取る必要があります。

于 2011-02-16T13:38:29.357 に答える
2

MD5およびSHA1 ハッシュを保存すると、不要な複雑さが増し、設計が良くないと思います。(SHA1, file size) のタプルを格納するだけで十分だと思います。特に新しいコミュニティ サイトを開始する場合は、その解決策を安全に使用し、問題が発生した場合にのみ、より賢いものを作成します。ことわざにあるように、時期尚早の最適化は諸悪の根源であり、それが「最適化」になるかどうかは議論の余地があります。

編集: MD5 + SHA1 衝突が発生する可能性を定量化しませんでした。ゼロと言っていいでしょう。大雑把な、エンベロープ計算の裏側では、同一の (SHA1,MD5) タプルを持つ任意のファイル サイズの 2 つの異なるファイルのオッズは 2^-288 であり、これは私の知る限りゼロです。同一のファイルサイズを要求する必要があるため、さらに削減されます。

于 2011-02-16T13:30:02.270 に答える
0

Rabin フィンガープリンティング アルゴリズムの Broders 実装を使用できます。sha1 や md5 よりも高速に計算でき、衝突耐性があることが証明されています。ただし、悪意のある攻撃に対して安全であるとは考えられていません。フィンガープリント自体を変更しなくても、誰かが問題のファイルを意図的に変更する可能性があります。ファイルの類似性を確認したいだけなら、これはかなり良い解決策です。

テストされていない C# 実装:

http://www.developpez.net/forums/d863959/dotnet/general-dotnet/contribuez/algorithm-rabin-fingerprint/

于 2014-08-13T10:57:41.077 に答える