画像ごとに一意のファイル名を生成したいので、MD5 を使用してファイル名を作成しています。2 つの同じ画像が異なる場所から取得される可能性があるため、実際には画像の内容に基づいてハッシュを作成したいと考えています。これにはどのような注意事項がありますか?
(価値があるためにPHP5でこれを行う)
良いアプローチです。2 つの異なる画像が同じ値にハッシュされる可能性は非常に低いですが、実際には、データ センターが小惑星の直撃を受ける可能性が高くなります。
1 つの注意点は、画像を削除するときは注意が必要だということです。あるファイルを指すイメージ レコードを削除し、そのファイルも削除すると、同じイメージを指す別のレコード (別のユーザーに属するなど) を持つファイルが削除される可能性があります。
MD5 は壊れているため、MD5 の代わりに SHA-1 を使用する必要があります。同じ MD5 ハッシュを持つ異なるファイルのペアがあります (理論的ではありません。これらは実際に知られており、さらに多くのペアを生成するアルゴリズムがあります)。アプリケーションの場合、これは誰かが同じ MD5 ハッシュを持つ 2 つの異なる画像をアップロードできることを意味します (または、誰かがそのような画像のペアを生成し、インターネットのどこかに公開して、2 人のユーザーが後でそれらをアップロードしようとする可能性があります。紛らわしい結果)。
完全にランダムなファイル コンテンツと適切な暗号化ハッシュが与えられた場合、ファイル数がおよそ 2 ~ (ハッシュ関数のビット数 / 2) の場合、同じハッシュ値を持つ 2 つのファイルが存在する確率は 50% に達します。つまり、128 ビット ハッシュの場合、ファイル数が 2^64 に達すると、50% の確率で衝突が少なくとも 1 回発生します。
ファイルの内容は明らかにランダムではありませんが、それが衝突の確率にどれほど強く影響するかはわかりません。これは誕生日攻撃と呼ばれます。
確率ゲームです。画像の数が 2^64 より大幅に少ない場合は、おそらく問題ありません。それでも心配な場合は、SHA-1 と MD5 の組み合わせを使用すると (別の回答が示唆されているように)、合計 288 の高品質ハッシュ ビットが得られます。 2^144 ファイルです。2^144 は非常に大きな数です。めちゃめちゃ大きい。巨大とさえ言えるかもしれません。
32文字のファイル名でよければ、私には問題ないようです。
編集:これを (たとえば) FBI のテロリストのマグショットの中央データベースの基礎として使用するつもりはありません。十分に動機付けられた攻撃者は、おそらく既存のものと同じ MD5 を持つ画像を思いつく可能性があるからです。その場合は、代わりに SHA1 を使用できます。これは、より安全です。
代わりに UUID を使用できますか?
重複ファイルを識別するために P2P ネットワークが使用している技術を調べることをお勧めします。MD5、SHA-1、およびファイル長を含むソリューションは、かなり信頼できます (そしておそらくやり過ぎです)。
ストックフォトなど、異なる場所から2つの同一の画像をロードした場合、「オリジナル」を上書きしてしまう可能性があります。ただし、これは、2 つではなく、1 つのコピーのみを保存していることを意味します。
そうは言っても、あなたが説明した方法でそれを行うことに大きな問題は見られません。
時間がかかります。それらに連続したIDを割り当ててみませんか?