2012-12-03 75 views
5

我有7個文件,我正在生成MD5哈希。哈希用於確保數據存儲的遠程副本與本地副本相同。不幸的是,這兩個數據副本之間的聯繫令人頭腦遲鈍。對數據的更改非常少見,但我有一個要求,即數據必須始終同步(或儘快)。我並不是在我的(非常慢的)通信鏈路上傳遞7個不同的MD5散列,而是爲每個文件生成散列,然後將這些散列組合成一個散列,然後我可以傳輸然後重新計算/用於比較在遠程端。如果「組合散列」不同,那麼我會開始發送7個獨立散列來確定哪些文件已被更改。例如,這裏的MD5哈希爲7檔截至上週:結合多個文件的MD5哈希

0709d609d69385255c496436eb50402c 
709465a74411bd596595c7b9b158ae6a 
4ab657320ef33e3d5eb498e4c13d41b7 
3b49c6ab199994fd776bb63761414e72 
0fc28c5a010fc3c06c0c930c88e31a15 
c4ecd214662cac5aae0e53f6f252bf0e 
8b086431e43148a2c2d943ba30d31cc6 

我想這些散列結合在一起,這樣我得到一個獨特的價值,我(也許是另一個MD5哈希?)然後可以發送到遠程系統。在遠程系統上,我會執行相同的計算來確定整個數據是否已被更改。如果有,那麼我會開始發送各個哈希等。最重要的因素是我的「組合哈希」應該足夠短,以便它比使用首先發送全部7個哈希的帶寬更少。我想將7個MD5散列寫入一個文件,然後散列該文件,但有沒有更好的方法?

+0

它應該工作,只要確保本地和遠程系統之間哈希的順序相同 – Martheen

回答

4

你爲什麼不:

  • 生成MD5 7個散列(這是你現在在做什麼),然後
  • 結合這7個哈希輸出到更大的字節數組和MD5哈希那以產生整體散列。 (每個MD5哈希值是16個字節,所以您最終將得到一個112字節的數組,您將散列以獲得整體哈希值)。

如果您的整體散列與另一端相匹配,則不需要做任何事情。如果沒有,那麼你開始發送你的中間7個哈希來確定哪些文件已經改變。

+0

感謝您的非常簡單但很棒的主意。 – user685869

3

你可以計算所有七個文件連接在一起的內容的散列。

不過,我不建議,因爲你會打開自己,以微妙的錯誤,如:

file1: 01 02 03 04 file2: 05 06 07 08 

會出現亂碼一樣

file1: 01 02 file2: 03 04 05 06 07 08 

如何慢是你的通訊鏈接?一個MD5散列是32個字節。

其中7個小於1/4 KB;這只是沒有太多數據。

鏈接的哪一側是文件要更改?

您可以在該端緩存一組MD5,然後將這些文件定期與緩存的哈希進行比較,然後在發現差異時啓動傳輸。

+0

不用相信,我的通信鏈路是1200bps調制解調器(大約150字節/秒)。這就是爲什麼我希望在絕大多數情況下都能傳輸單個MD5的原因。 :-) – user685869

+1

我記得1200bps的調制解調器;-) 但是,這仍然不到2秒來傳輸七個MD5;如果你壓縮它們,那麼更少 –

1

XOR他們都。

據我所知這是最簡單有效的解決方案。

0

我知道這是不在左邊的字段,但您可以簡單地檢查所有文件的存檔屬性,並且如果有任何文件設置了此標誌,則文件以某種方式更改。

然後你可以繼續創建一個哈希,如果沒有,甚至不打擾生成一個哈希。

如果設置了存檔屬性,則生成散列,同步文件並取消設置存檔屬性。

這將是我建議的解決方案。