Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定C+中已更改数据的最佳方法+; 我需要在C++中编写一个工具来确定文件中的更改位,而不是复制的另一个文件。实现这一点的最佳方法是什么_C++_File_Compare_Replication_Librsync - Fatal编程技术网

确定C+中已更改数据的最佳方法+; 我需要在C++中编写一个工具来确定文件中的更改位,而不是复制的另一个文件。实现这一点的最佳方法是什么

确定C+中已更改数据的最佳方法+; 我需要在C++中编写一个工具来确定文件中的更改位,而不是复制的另一个文件。实现这一点的最佳方法是什么,c++,file,compare,replication,librsync,C++,File,Compare,Replication,Librsync,我心中没有特定的操作系统或库,我愿意接受建议。我的主要目标是减少复制过程中涉及的网络通信量。看看rsync-它将文件分成块,计算每个块的校验和,并仅传输校验和,以确定在传输块数据之前是否对目标进行了任何更改(仅在必要时)。我将首先尝试一些diff()的实现。如果不能按原样使用rsync,请检查。它很旧,但是代码很容易阅读和改进。建议:使用哈希函数和分治方法来缩小更改块。不完全是一个防碰撞的解决方案,但是SHA-2 IMO可以为您工作。如果您没有在同一台机器上使用新旧版本的文件,那么类似rsync

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

看看rsync-它将文件分成块,计算每个块的校验和,并仅传输校验和,以确定在传输块数据之前是否对目标进行了任何更改(仅在必要时)。我将首先尝试一些diff()的实现。

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

建议:使用哈希函数和分治方法来缩小更改块。不完全是一个防碰撞的解决方案,但是SHA-2 IMO可以为您工作。

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

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


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

Diff通常通过比较所有数据来工作。不是你想要的减少网络流量…@dmckee,这取决于具体情况。在某些情况下,每个文件的两个版本在发送方计算机上都可用。在这种情况下,您可以生成差异/增量,这将导致比rsync的流量少得多。实际上,它甚至比rsync的流量还要少——它使用滚动校验和,即使已将块移动到非块对齐的位置,也可以检测到相等的块。在我写答案时,我意识到您忘了提到rsync的一个很好的卖点:它可以在发送机上同步文件的两个版本。