在C++中确定更改数据的最佳方法
Best method to determine changed data in C++
我需要用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可以为您工作。
- 在c代码之间共享数据的最佳方式
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 将线程中的数据存储到全局容器的最佳方法?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 使用 QT C++过滤大数据的最佳方式
- 在wxWidgets的事件中包含我自己的数据的最佳方法是什么?
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 用于存储分组关系和支持外观的最佳数据结构
- 适用于频繁更改的大型数据集的最佳数据结构
- 将数据从一个应用程序单向发送到另一个应用程序的最佳做法
- 点遍历的最佳数据结构
- 使用 jsoncpp 时从 JSon 剥离私有数据的最佳方法
- 代表软件包安装和系统依赖关系的最佳数据结构
- 在 c++ 中,在线程之间共享数据容器的最佳方法是什么?
- 组织从内存读取的数据的最佳方法(用于调试)c++
- 数字序列的最佳数据结构 [0:9]
- 什么是在C 中存储结果INT*的最佳数据类型
- 我的数据结构的最佳序列化方法
- 存储数据列表并自动分配给结构的最佳方法是什么