こんばんは
バッキング ストアとして 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 を実装しています - 他の誰かに役立つことを願っています