Rails: контрольная сумма загруженных файлов

Я генерирую контрольную сумму (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, то все контрольные суммы равны.

5
задан Arsen7 21 June 2011 в 13:41
поделиться