Amazon S3 に画像ライブラリがあります。画像ごとに、サーバー上のソース URL とタイムスタンプを md5 して、一意のファイル名を取得します。S3 はサブディレクトリを持つことができないため、これらすべての画像を 1 つのフラット フォルダーに保存する必要があります。
生成される MD5 ハッシュ値の衝突について心配する必要はありますか?
おまけ: MD5 が生成するハッシュ値で競合が発生する前に、いくつのファイルを作成できますか?
ちょうど 2 つのハッシュが偶発的に衝突する確率は1/2 128 で、これは340 10 億 282 10 億 366 10 億 920 8 億 938 7 億 463 463 京 374 1000 兆 607 兆 4310 億 7 億 6800 万 211 千 456 です。
ただし、すべてのハッシュを保持すると、誕生日のパラドックスのおかげで確率が少し高くなります。ハッシュが他のハッシュと衝突する確率を 50% にするには、2 64 個のハッシュが必要です。つまり、衝突を起こすには、平均して1 秒あたり60億個のファイルを 100 年間ハッシュする必要があります。
S3 はサブディレクトリを持つことができます。キー名に「/」を入れるだけで、あたかも別のディレクトリにあるかのようにファイルにアクセスできます。これを使用して、S3 のユーザー ID に基づいて別のフォルダーにユーザー ファイルを保存します。
例: 「mybucket/users/1234/somefile.jpg」。ファイル システムのディレクトリとまったく同じではありませんが、S3 API には、ほぼ同じように機能するいくつかの機能があります。「users/1234/」で始まるすべてのファイルを一覧表示するように要求すると、その「ディレクトリ」内のすべてのファイルが表示されます。
待って、それは:
md5(filename) + timestamp
また:
md5(filename + timestamp)
前者の場合は、GUID へのほとんどの道のりであり、私はそれについて心配する必要はありません。後者の場合は、最終的に衝突に遭遇する方法についての Karg の投稿を参照してください。
衝突の大まかな経験則は、値の範囲の平方根です。MD5 sig の長さはおそらく 128 ビットなので、2^64 の画像を超えて衝突が発生する可能性があります。
ランダムな MD5 衝突は非常にまれですが、ユーザーがファイル (逐語的に保存される) を提供できる場合、衝突が発生するように設計することができます。つまり、MD5sum が同じでデータが異なる 2 つのファイルを故意に作成できます。アプリケーションがこのケースを賢明な方法で処理できることを確認するか、SHA-256 のようなより強力なハッシュを使用してください。
衝突による MD5 の問題はよく知られていますが、ランダム データ間の意図しない衝突は非常にまれです。一方、ファイル名をハッシュしている場合、それはランダムなデータではなく、衝突がすぐに発生することが予想されます。
それがどれほど可能性が高いかは問題ではありません。可能です。ハッシュする最初の 2 つのもので発生する可能性があるため (ほとんどありませんが、可能性はあります)、最初から衝突をサポートする必要があります。
MD5 の衝突はほとんどありません。9 兆の MD5 がある場合、衝突が発生する可能性は9 兆に 1 回しかありません。