确定C ++中已更改数据的最佳方法
-
03-07-2019 - |
题
我需要用C ++编写一个工具来确定文件中的更改位与另一个文件进行比较以进行复制。什么是实现这一目标的最佳方法?
我没有特定的操作系统或库,我愿意接受建议。我的主要目标是减少复制所涉及的网络流量。
解决方案
查看rsync - 它将文件拆分为块,计算每个块的校验和,并仅传输校验和以确定在仅在必要时传输块数据之前是否存在任何目标更改。
其他提示
如果您不能按原样使用rsync,请查看 librsync 。它已经过时了,但代码很容易阅读和改进。
如果您在同一台计算机上没有旧版本和新版本的文件,那么类似rsync的算法就是前进的方法(参见前面的答案)。如果你在同一台机器上同时拥有旧版本和新版本的文件,那么你可以比rsync做得更好:生成压缩差异并通过网络发送它们。
要生成有效的差异,请查看VCDIFF(RFC 3284)二进制增量压缩。一个很好的实现是xdelta(www.xdelta.org)。如果由于许可证问题而希望避免在接收端使用xdelta,那么实现解码器/解压缩器相当容易。编写自己的VCDIFF差异生成器将生成紧凑的差异要复杂得多(想想搜索移动的块作为示例)。
在VCDIFF中,差异也可以是无源的,这意味着它们会在没有任何源文件(应用差异的文件)的情况下解压缩到目标文件中 - 在VCDIFF中压缩文件是创建压缩文件的特殊情况两个文件之间的增量。这很有用,因为无论目标是否具有文件版本,都可以使用相同的格式。
我首先尝试一些diff的实现( http://en.wikipedia.org/wiki /差值)
建议:使用哈希函数&分裂与分裂征服缩小变革块的方法。不完全是防碰撞解决方案,但SHA-2 IMO可能适合您。
不隶属于 StackOverflow