Ruby on Railsでアップロードされた画像のチェックサム(sha256)を生成しています。Rails:アップロードされたファイルのチェックサム
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つの文が異なる値を返しています。 UploadedFileオブジェクトを使用してデータを読み取ることにより、checksum1が生成されます。 ファイルシステムから一時ファイルを読み取ることによってchecksum2が生成されます。
ActionDispatch :: Http :: UploadedFileのオブジェクトは、アップロードされたファイルの内容以上のものを返しますか?ファイルシステムに書き込まれたアップロードファイルのチェックサムを生成すると、checksum1
(UploadedFile.read)ではなく、checksum2
(一時ファイルチェックサム)と一致しています。
ファイルシステムから一時ファイルを読み込んで生成されたチェックサムは、オブジェクト(UploadedFile)の実装が変更される可能性があるため、より信頼性が高いと仮定しています。必要に応じて、ファイルシステム上の既存ファイルのチェックサムを生成する方が簡単です。
したがって、チェックサムの違いと信頼性の違いは何ですか?
ありがとうございます。
アップデート1: @あたりパブロ・castellazzi提案として、私はダイジェストを使用してハッシュを生成:: SHA256.file(upload.path).hexdigest。 @ Arsen7で述べたように、私は、ファイルを読むために、バイナリモードを使用すると、すべてのチェックサムが等しい:私たちはこのchecksum3はチェックサム1に等しいが、チェックサム2
からアップデート2の違い
このchecksum3を呼びましょう。
今後参考になるように、ファイルチェックサムを取得するより良い方法は 'Digest :: SHA256.file(path_to_file).hexdigest'です。 File.readを使用すると、メモリ不足のエラーが発生する可能性があります。 –