【问题标题】:Best method to determine changed data in C++在 C++ 中确定更改数据的最佳方法
【发布时间】:2008-10-22 18:27:11
【问题描述】:

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

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

【问题讨论】:

    标签: c++ file compare replication librsync


    【解决方案1】:

    查看 rsync - 它将文件拆分为块,计算每个块的校验和,并仅在必要时传输块数据之前仅传输校验和以确定目标是否有任何更改。

    【讨论】:

    • 它实际上比这更好——它使用滚动校验和,即使它们已被移动到非块对齐的位置,它也可以检测到相等的块。
    • 在我写答案的时候,我意识到你忘了提到 rsync 的一个很好的卖点:它可以在没有两个版本的文件在发件人机器上同步的情况下工作。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • Diff 通常通过比较所有数据来工作。不是您想要减少网络流量的...
        • @dmckee,这取决于具体情况。在某些情况下,每个文件的两个版本在发件人计算机上都可用。在这种情况下,您可以生成差异/增量,这将导致比 rsync 的流量少得多。
        【解决方案5】:

        建议:使用散列函数和分治法来缩小变更范围。不完全是防碰撞解决方案,但 SHA-2 IMO 可以为您工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多