天啊,

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

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

服务器
将大块追加到文件
计算完整文件的SHA1哈希值以验证正确的收货

现在,我希望做的是在每个块上使用ruby(1.9.3)Digest::SHA1 < 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 >

是否有人对如何做有任何想法:
  • 是否可以访问底层内存(用C语言操作)并存储/还原类似的对象?
  • 是否获得允许类似用例的替代实现?

  • 谢谢,

    形容词

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

    最佳答案

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

    关于ruby - 我可以序列化ruby Digest::SHA1实例对象吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9883649/

    10-13 04:44