Algorithm rsync算法如何正确识别重复块?
我个人的任务是学习rsync算法是如何工作的。经过一番阅读和思考,我想到了一个我认为算法失败的情况。我正在试图弄清楚如何在实际实现中解决这个问题 考虑这个例子,其中A是接收者,B是发送者Algorithm rsync算法如何正确识别重复块?,algorithm,hash,rsync,Algorithm,Hash,Rsync,我个人的任务是学习rsync算法是如何工作的。经过一番阅读和思考,我想到了一个我认为算法失败的情况。我正在试图弄清楚如何在实际实现中解决这个问题 考虑这个例子,其中A是接收者,B是发送者 A = abcde1234512345fghij B = abcde12345fghij 如您所见,唯一的变化是12345已被删除 现在,为了使这个示例更有趣,让我们选择一个5字节(字符)的块大小。使用弱校验和对发送方的值进行散列,得到以下值列表 abcde|12345|fghij abcde ->
A = abcde1234512345fghij
B = abcde12345fghij
如您所见,唯一的变化是12345
已被删除
现在,为了使这个示例更有趣,让我们选择一个5字节(字符)的块大小。使用弱校验和对发送方的值进行散列,得到以下值列表
abcde|12345|fghij
abcde -> 495
12345 -> 255
fghij -> 520
values = [495, 255, 520]
接下来我们检查A中是否有任何哈希值不同。如果有匹配的块,我们可以跳到该块的末尾进行下一次检查。如果存在不匹配的块,那么我们发现了一个差异。我将逐步完成这个过程
fghij->520
(是,跳过)我遗漏了什么?rsync算法发送两个校验和:每个区块一个校验和,整个文件一个“滚动”校验和。在您的示例中,A在到达“加倍”块后将看到滚动校验和中的差异。问题可以使用更多标记:)(例如,算法?)为整个文件发送校验和是一个好主意。我不明白A在到达折叠块后会看到什么不同。在我看来,只有在计算了A的整个校验和之后,才能检测到差异,此时我们不知道重复块是什么。@Kai:Oops,我只是试图重新表述该注释以使其更清晰,但我丢失了它。总结:据我所知,这是一个滚动校验和,而不是散列;一个块的校验和取决于前一个块的校验和。哦!!!弱散列是整个文件的滚动校验和!但它的值记录在每个块的末尾。现在它有意义了。谢谢科德卡和杰弗罗米,没有你们两位的解释我是不会理解的。