我正在使用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(临时文件校验和)匹配,而不是与checksum1(UploadedFile.read)匹配。
我假设通过从文件系统中读取临时文件生成的校验和更可靠,因为对象(UploadedFile)实现可能会更改。如果需要,可以更容易地生成现有文件在文件系统上的校验和。
那么,checksums的差异原因是什么,哪一个更可靠?
谢谢。
更新1: 根据@pablo-castellazzi的建议,我使用Digest :: SHA256.file(upload.path)。hexdigest生成了哈希值。让我们称此为checksum3
这个checksum3等于checksum1但与checksum2不同。
更新2:如果我使用二进制模式读取文件,就像@Arsen7所提到的那样,那么所有的checksums都相等。
Digest::SHA256.file(path_to_file).hexdigest
。使用File.read
可能会导致内存不足错误。 - Pablo Castellazzi