【发布时间】:2008-10-22 18:27:11
【问题描述】:
我需要用 C++ 编写一个工具来确定一个文件中更改的位与另一个文件进行比较以进行复制。实现这一目标的最佳方法是什么?
我没有具体的操作系统或库,我愿意接受建议。我的主要目标是减少复制所涉及的网络流量。
【问题讨论】:
标签: c++ file compare replication librsync
我需要用 C++ 编写一个工具来确定一个文件中更改的位与另一个文件进行比较以进行复制。实现这一目标的最佳方法是什么?
我没有具体的操作系统或库,我愿意接受建议。我的主要目标是减少复制所涉及的网络流量。
【问题讨论】:
标签: c++ file compare replication librsync
查看 rsync - 它将文件拆分为块,计算每个块的校验和,并仅在必要时传输块数据之前仅传输校验和以确定目标是否有任何更改。
【讨论】:
如果您不能按原样使用 rsync,请检查 librsync。它很旧,但代码易于阅读和改进。
【讨论】:
如果您在同一台机器上没有新旧版本的文件,那么类似 rsync 的算法是前进的方向(请参阅之前的答案)。如果您确实在同一台机器上同时拥有旧版本和新版本的文件,那么您可以比 rsync 做得更好:生成压缩差异并通过网络发送它们。
要生成有效的差异,请查看 VCDIFF (RFC 3284) 二进制增量压缩。一个很好的实现是 xdelta (www.xdelta.org)。如果您想避免由于许可证问题而在接收端使用 xdelta,那么实现解码器/解压缩器相当容易。编写自己的 VCDIFF 差异生成器来生成紧凑的差异要复杂得多(以搜索移动的块为例)。
在 VCDIFF 中,差异也可以是无源的,这意味着它们在手头没有任何源文件(应用差异的文件)解压到目标文件中——在 VCDIFF 中,压缩文件是创建压缩文件的特殊情况两个文件之间的增量。这很有用,因为无论目标是否有您的文件版本,您都可以使用相同的格式。
【讨论】:
我会先尝试一些 diff 的实现 (http://en.wikipedia.org/wiki/Diff)
【讨论】:
建议:使用散列函数和分治法来缩小变更范围。不完全是防碰撞解决方案,但 SHA-2 IMO 可以为您工作。
【讨论】: