2008-10-22 102 views
4

我需要用C++編寫一個工具來確定文件中已更改的位與另一個要複製的文件進行比較。完成此操作的最佳方法是什麼?確定C++中已更改數據的最佳方法

我沒有具體的操作系統或庫,我樂於接受建議。我的主要目標是減少複製涉及的網絡流量。

回答

17

查看rsync - 它將文件拆分成塊,計算每個塊的校驗和,並僅傳輸校驗和以確定在傳輸塊數據之前是否存在任何變化(僅在需要時)。

+0

實際上它甚至比它更好 - 它使用滾動校驗和,即使它們已經移動到非塊對齊的位置,也可以檢測相等的塊。 – ephemient 2008-10-22 18:44:14

+0

在我寫回答時,我意識到你忘了提及rsync的一個很好的賣點:它在沒有在發送者機器上同步文件的兩個版本的情況下工作。 – Alexander 2008-10-22 23:24:12

3

如果你不能用rsync的原樣,檢查librsync。這是舊的,但代碼很容易閱讀和改進。

0

建議:使用散列函數&除法&征服方法來縮小變化塊。不完全是防碰撞解決方案,但SHA-2 IMO可以爲您工作。

2

如果在同一臺機器上沒有舊版本和新版本的文件,那麼類似rsync的算法是前進的方向(請參閱以前的答案)。如果你在同一臺機器上同時擁有舊版本和新版本的文件,那麼你可以比rsync做得更好:生成壓縮的差異並通過網絡發送它們。

要生成有效的差異,請查看VCDIFF(RFC 3284)二進制增量壓縮。一個很好的實現是xdelta(www.xdelta.org)。如果您想避免在接收端因爲許可問題而使用xdelta,那麼實現解碼器/解壓縮器相當容易。編寫自己的VCDIFF差異生成器將會生成緊湊的差異,這非常複雜(例如,考慮搜索移動塊)。

在VCDIFF中,diffs也可以是無源的,這意味着它們解壓縮到目標文件中,而不需要任何源文件(應用diff的文件) - 在VCDIFF中壓縮文件是創建兩個文件之間壓縮的增量。這很有用,因爲無論目標是否具有文件版本,您都可以使用相同的格式。

相關問題