Algorithm rsync算法如何正确识别重复块?

Algorithm rsync算法如何正确识别重复块?,algorithm,hash,rsync,Algorithm,Hash,Rsync,我个人的任务是学习rsync算法是如何工作的。经过一番阅读和思考,我想到了一个我认为算法失败的情况。我正在试图弄清楚如何在实际实现中解决这个问题 考虑这个例子,其中A是接收者,B是发送者 A = abcde1234512345fghij B = abcde12345fghij 如您所见,唯一的变化是12345已被删除 现在,为了使这个示例更有趣,让我们选择一个5字节(字符)的块大小。使用弱校验和对发送方的值进行散列,得到以下值列表 abcde|12345|fghij abcde ->

我个人的任务是学习rsync算法是如何工作的。经过一番阅读和思考,我想到了一个我认为算法失败的情况。我正在试图弄清楚如何在实际实现中解决这个问题

考虑这个例子,其中A是接收者,B是发送者

A = abcde1234512345fghij
B = abcde12345fghij
如您所见,唯一的变化是
12345
已被删除

现在,为了使这个示例更有趣,让我们选择一个5字节(字符)的块大小。使用弱校验和对发送方的值进行散列,得到以下值列表

abcde|12345|fghij

abcde -> 495
12345 -> 255
fghij -> 520

values = [495, 255, 520]
接下来我们检查A中是否有任何哈希值不同。如果有匹配的块,我们可以跳到该块的末尾进行下一次检查。如果存在不匹配的块,那么我们发现了一个差异。我将逐步完成这个过程

  • 散列第一个块。值列表中是否存在此哈希<代码>abcde->495(是,跳过)
  • 散列第二个块。值列表中是否存在此哈希<代码>12345->255(是,跳过)
  • 散列第三个块。值列表中是否存在此哈希<代码>12345->255(是,跳过)
  • 散列第四个块。值列表中是否存在此哈希
    fghij->520
    (是,跳过)
  • 没有更多的数据,我们完成了
  • 因为每个散列都是在值列表中找到的,所以我们得出结论A和B是相同的。依我拙见,这不是真的

    在我看来,每当有多个块共享同一哈希时,就会发生这种情况。我知道我跳过了计算和检查强散列的步骤,但这不会有什么区别,因为第二个和第三个块完全相同


    我遗漏了什么?

    rsync算法发送两个校验和:每个区块一个校验和,整个文件一个“滚动”校验和。在您的示例中,A在到达“加倍”块后将看到滚动校验和中的差异。

    问题可以使用更多标记:)(例如,算法?)为整个文件发送校验和是一个好主意。我不明白A在到达折叠块后会看到什么不同。在我看来,只有在计算了A的整个校验和之后,才能检测到差异,此时我们不知道重复块是什么。@Kai:Oops,我只是试图重新表述该注释以使其更清晰,但我丢失了它。总结:据我所知,这是一个滚动校验和,而不是散列;一个块的校验和取决于前一个块的校验和。哦!!!弱散列是整个文件的滚动校验和!但它的值记录在每个块的末尾。现在它有意义了。谢谢科德卡和杰弗罗米,没有你们两位的解释我是不会理解的。