2

こんばんは

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

4

1 に答える 1

0

64k チャンクの SHA1 を送信することを検討しましたか? チェックサム データは増えますが、どこで問題が発生したかがわかるため、ダイジェストの内部状態を保存する必要はありません。

于 2012-03-29T02:39:01.857 に答える