【问题标题】:Can I serialize a ruby Digest::SHA1 instance object?我可以序列化一个 ruby​​ Digest::SHA1 实例对象吗?
【发布时间】:2023-03-24 20:29:01
【问题描述】:

G'day 人,

我正在使用 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 > 

有没有人知道如何:

  1. 访问底层内存(用 C 语言操作)并存储/恢复这样的对象?
  2. 获得允许类似用例的替代实现?

谢谢,

参数

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

【问题讨论】:

    标签: ruby serialization redis sha1 digest


    【解决方案1】:

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

    【讨论】:

    • Joshua - 好主意,是的,我们正在考虑每块哈希,并且上传协议的修订版正在我们的路线图中。不幸的是,我们有无数的下层客户端安装(大约 5000 个左右),所以我们上面的想法是一个次要的服务器端性能特性,而我们一起收集了一个全新的客户端版本。感谢您的反馈意见 !参数
    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多