在C++中确定更改数据的最佳方法

Best method to determine changed data in C++

本文关键字:数据 最佳 方法 C++      更新时间:2023-10-16

我需要用C++编写一个工具来确定一个文件中与另一个文件相比的更改位,以便进行复制。实现这一目标的最佳方法是什么?

我没有具体的操作系统或库,我愿意接受建议。我的主要目标是减少复制过程中涉及的网络流量。

看看rsync-它将文件拆分为多个块,为每个块计算校验和,并仅传输校验和以确定是否对目标进行了任何更改,然后仅在必要时传输块数据。

如果不能按原样使用rsync,请检查librsync。它很旧,但代码很容易阅读和改进。

如果您在同一台机器上没有旧版本和新版本的文件,那么类似rsync的算法就是前进的方向(请参阅前面的答案)。如果你在同一台机器上同时拥有旧版本和新版本的文件,那么你可以比rsync做得更好:生成压缩的diff并通过网络发送。

为了生成高效的diff,请查看VCDIFF(RFC 3284)二进制delta压缩。一个很好的实现是xdelta(www.xdelta.org)。如果你想避免因为许可证问题而在接收端使用xdelta,那么实现解码器/解压缩器相当容易。编写自己的VCDIFF diff生成器来生成紧凑的diff要复杂得多(以搜索移动的块为例)。

在VCDIFF中,diff也可以是无源的,这意味着它们解压到目标文件中,而手头没有任何源文件(应用diff的文件)——在VCDIFV中,压缩文件是在两个文件之间创建压缩增量的特殊情况。这很有用,因为无论目标是否有文件版本,都可以使用相同的格式。

我将首先尝试diff的一些实现(http://en.wikipedia.org/wiki/Diff)

建议:使用哈希函数&一个鸿沟&征服方法来缩小改变的范围。不完全是一个防撞解决方案,但SHA-2 IMO可以为您工作。