我正在 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
最后两个语句返回不同的值。checksum1 是通过使用 UploadedFile 对象读取数据生成的。checksum2 是通过从文件系统中读取临时文件生成的。
ActionDispatch::Http::UploadedFile 的对象是否返回上传文件的内容以外的任何内容?当我生成写入文件系统的上传文件的校验和时,它与checksum2
(temporary file checksum) 匹配,而不是与checksum1
(UploadedFile.read) 匹配。
我假设通过从文件系统读取临时文件生成的校验和更可靠,因为对象(UploadedFile)实现可能会发生变化。如果需要,生成文件系统上现有文件的校验和会更容易。
那么,校验和不同的原因是什么,哪个更可靠呢?
谢谢你。
更新 1:根据@pablo-castellazzi 的建议,我使用 Digest::SHA256.file(upload.path).hexdigest 生成了哈希。让我们称之为校验和3
这个 checksum3 等于 checksum1 但不同于 checksum2
更新2:如果我使用二进制模式读取@Arsen7 提到的文件,那么所有校验和都是相等的。