我正在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
最后两条语句返回不同的值。 校验和1是通过使用UploadedFile对象读取数据而生成的。 校验和2是通过从文件系统读取临时文件生成的。
ActionDispatch :: Http :: UploadedFile的对象是否返回超过上传文件内容的内容?当我生成写入文件系统的上传文件的校验和时,它与checksum2
(临时文件校验和)匹配,而不与checksum1
(UploadedFile.read)匹配。
我假设从文件系统读取临时文件生成的校验和更可靠,因为对象(UploadedFile)实现可能会更改。如果需要,可以更容易地在文件系统上生成现有文件的校验和。
那么,校验和与哪一个更可靠的区别是什么原因呢?
谢谢。
更新1: 作为每@巴勃罗-卡斯特建议我通过使用摘要:: SHA256.file(upload.path).hexdigest生成的散列。让我们把这个checksum3
这checksum3等于校验码,但是从校验码
更新2相:如果我用的是二进制模式改为由@ Arsen7提到的文件,那么所有的校验和相等。
为了将来的参考,更好的获取文件校验和的方法是'Digest :: SHA256.file(path_to_file).hexdigest'。使用File.read可能会导致内存不足错误。 –