Ruby on Railsでアップロードされた画像のチェックサム(sha256)を生成しています。
upload = params[:file]
data1 = upload.read
data2 = File.read(upload.tempfile)
checksum1 = Digest::SHA256.hexdigest(data1)
checksum2 = Digest::SHA256.hexdigest(data2)
puts checksum1
puts checksum2
最後の2つのステートメントは、異なる値を返しています。checksum1は、UploadedFileオブジェクトを使用してデータを読み取ることによって生成されます。checksum2は、ファイルシステムから一時ファイルを読み取ることによって生成されます。
ActionDispatch :: Http :: UploadedFileのオブジェクトは、アップロードされたファイルの内容以外のものを返しますか?ファイルシステムに書き込まれたアップロードファイルのチェックサムを生成すると、 (UploadedFile.read)checksum2
ではなく(一時ファイルチェックサム)と一致します。checksum1
オブジェクト(UploadedFile)の実装が変更される可能性があるため、ファイルシステムから一時ファイルを読み取ることによって生成されるチェックサムの方が信頼性が高いと想定しています。必要に応じて、ファイルシステム上の既存のファイルのチェックサムを生成する方が簡単です。
では、チェックサムの違いの理由は何ですか?どちらがより信頼できるのでしょうか?
ありがとうございました。
更新1:@ pablo-castellazziの提案に従って、Digest :: SHA256.file(upload.path).hexdigestを使用してハッシュを生成しました。このチェックサム3と呼びましょう
このchecksum3はchecksum1と同じですが、checksum2とは異なります。
更新2:@ Arsen7で言及されているように、バイナリモードを使用してファイルを読み取る場合、すべてのチェックサムは等しくなります。