TL;DR: ファイル コンテンツの SHA-1 をファイル名として使用して、添付ファイル (不透明なファイル) を保存する CMS システムを使用しています。両方のファイルの SHA-1 ハッシュが一致することが既にわかっている場合、アップロードされたファイルが実際にストレージ内のファイルと一致するかどうかを確認するにはどうすればよいですか? 高性能にしたい。
長いバージョン:
ユーザーが新しいファイルをシステムにアップロードすると、アップロードされたファイルの内容の SHA-1 ハッシュを計算し、同じハッシュを持つファイルがストレージ バックエンドに既に存在するかどうかを確認します。コードを実行する前にPHP がアップロードされたファイルを挿入し、アップロードされたファイルに対して/tmp
実行sha1sum
して、ファイルの内容の SHA-1 ハッシュを取得します。次に、計算された SHA-1 ハッシュからファンアウトを計算し、NFS マウント ディレクトリ階層の下にストレージ ディレクトリを決定します。(たとえば、ファイルの内容の SHA-1 ハッシュが37aefc1e145992f2cc16fabadcfe23eede5fb094
永続的なファイル名である場合は、/nfs/data/files/37/ae/fc1e145992f2cc16fabadcfe23eede5fb094
.) 実際のファイルの内容を保存することに加えてINSERT
、ユーザーが送信したメタデータ (Content-Type
元のファイル名など) の新しい行を SQL データベースに追加しました。 、日付スタンプなど)。
私が現在把握しているコーナー ケースは、新しくアップロードされたファイルに、ストレージ バックエンドの既存のハッシュと一致する SHA-1 ハッシュがある場合です。これが偶然に起こった場合の変化が天文学的に低いことは知っていますが、私は確信したいと思います. (意図的なケースについては、https://shattered.io/を参照してください)
$file_a
2 つのファイル名とが与えられ$file_b
た場合、両方のファイルの内容が同じかどうかをすばやく確認する方法は? ファイルが大きすぎてメモリにロードできないとします。Python の場合は使用しますfilecmp.cmp()
が、PHP には似たようなものはないようです。一致しないバイトが見つかった場合、これを実行して中止できることは知っていますがfread()
、そのコードを記述したくありません。