我可以序列化ruby Digest :: SHA1实例对象吗?

时间:2012-03-27 05:07:53

标签: ruby serialization redis sha1 digest

G'day人,

我正在使用redis作为后备存储在ruby(sinatra)中重新实现现有的自定义文件上载服务。

客户端  计算SHA1哈希值并启动上传  上传最多64K块直到完成

服务器  将块添加到文件中  计算完整文件的SHA1哈希以验证正确的收据

现在,我希望做的是使用ruby(1.9.3)Digest :: SHA1<< (更新)每个块上的运算符,(而不是必须从头开始读取整个ENTIRE文件)。 [大文件> 1GB。

不幸的是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. 获取允许类似用例的替代实现?
  3. 谢谢,

    参数

    更新:gist:2280705使用ruby FFI实现选项1 - 希望它对其他人有用

1 个答案:

答案 0 :(得分:0)

您是否考虑过并且能够发送64k块的SHA1?会有更多的校验和数据,但你会知道出了什么问题,并且不需要存储摘要的内部状态。