Я генерирую контрольную сумму (sha256) загруженного изображения в Ruby on 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 что-нибудь, кроме содержимого загруженного файла? Когда я генерирую контрольную сумму загруженного файла, записанного в файловую систему, она совпадает с контрольной суммой2
(контрольная сумма временного файла), а не с контрольной суммой1
(UploadedFile.read).
] Я предполагаю, что контрольная сумма, сгенерированная при чтении временного файла из файловой системы, более надежна, поскольку реализация объекта (UploadedFile) может измениться. При необходимости будет проще сгенерировать контрольные суммы существующих файлов в файловой системе.
Итак, в чем причина разницы контрольных сумм и какая из них более надежна?
Спасибо.
Обновление 1 : Согласно предложению @ pablo-castellazzi я сгенерировал хеш с помощью Digest :: SHA256.file (upload.path) .hexdigest. Давайте назовем эту контрольную сумму3
Эта контрольная сумма3 равна контрольной сумме1, но отличается от контрольной суммы2
Обновление 2: если я использую двоичный режим для чтения файла, как указано @ Arsen7, то все контрольные суммы равны.