Могу ли я сериализовать объект экземпляра ruby ​​Digest :: SHA1? - PullRequest
2 голосов
/ 27 марта 2012

G'day люди,

Я повторно внедряю существующую службу загрузки пользовательских файлов в ruby ​​(sinatra) с помощью redis в качестве резервного хранилища.

Клиент вычисляет хеш SHA1 и инициирует загрузку загружает до 64K фрагментов до конца

Сервер добавляет куски в файл вычисляет SHA1-хэш полного файла для проверки правильности получения

Теперь то, что я надеюсь сделать, это использовать оператор ruby ​​(1.9.3) Digest :: SHA1 << (update) для каждого чанка (вместо того, чтобы читать файл ENTIRE с нуля в конце). Большие файлы> 1 ГБ.

К сожалению, Digest :: SHA1 и Marshal.dump не совместимы

1.9.3p125 :001 > require 'digest'
 => true 
1.9.3p125 :002 > $digest = Digest::SHA1.new
 => #<Digest::SHA1: da39a3ee5e6b4b0d3255bfef95601890afd80709> 
1.9.3p125 :003 > marshalled_digest = Marshal.dump($digest)
TypeError: no _dump_data is defined for class Digest::SHA1
    from (irb):3:in `dump'
    from (irb):3
    from /Users/rhodry/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>'
1.9.3p125 :004 > 

Есть ли у кого-нибудь идеи о том, как:

  1. Получить доступ к базовой памяти (манипулировать в C) и сохранить / восстановить подобный объект?
  2. Получить альтернативную реализацию, которая позволила бы подобный вариант использования?

Спасибо

параметр

Обновление: Суть: 2280705 Реализация варианта 1 с использованием ruby ​​FFI - надеюсь, что это будет полезно для кого-то еще

1 Ответ

0 голосов
/ 29 марта 2012

Рассматривали ли вы и можете ли вы отправить SHA1 из кусков 64 КБ?Было бы больше данных контрольной суммы, но вы бы знали, где что-то пошло не так, и не было бы необходимости хранить внутреннее состояние дайджеста.

...