2012-03-27 86 views
2

G'day people,我可以序列化ruby Digest :: SHA1實例對象嗎?

我正在使用redis作爲後備存儲在ruby(sinatra)中重新實現一個現有的自定義文件上傳服務。

客戶 計算SHA1哈希值,並啓動上傳 上傳最大64K塊直到完成

服務器 追加塊到文件 計算完整文件的SHA1哈希來驗證正確接收

現在,我我希望做的是在每個塊上使用ruby(1.9.3)Digest :: SHA1 < <(更新)運算符(而不必從頭開始讀取整個文件)。 [大文件> 1GB]。

不幸摘要:: 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. 獲取可以允許類似用例的替代實現?

感謝,

parameme

更新:gist:2280705使用Ruby FFI實現選項1 - 希望這是對別人有用

回答

0

你有沒有考慮和你能送的SHA1的64k塊?將會有更多的校驗和數據,但是你會知道事情出錯的地方,並且不需要存儲摘要的內部狀態。

+0

約書亞 - 好思想,是的,我們正在考慮每塊散列,並且上傳協議的修訂版本在我們的路線圖上。不幸的是,我們有大量的低級客戶端安裝(大約5000個左右),所以我們上面的思想泡泡是一個次要的服務器端性能特徵,而我們共同收集了一個全新的客戶端版本。感謝您的反饋意見 ! parameme – parameme 2012-03-29 04:24:42

相關問題