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