如何为重叠块生成滚动校验和?

时间:2012-09-17 09:30:50

标签: java algorithm rsync checksum

我最近遇到了Rsync算法,并考虑使用java实现它。该算法的重要部分之一是发送方的Rolling Checksum。

http://en.wikipedia.org/wiki/Rsync中,它解释了

  

“如果已经计算了字节1-25的滚动校验和,则可以单独从先前的校验和(R),字节1(n)和>字节计算>字节2-26的滚动校验和26(n + S)。“

我可以使用MD5或SHA为文件或字符串生成校验和。但我想要了解这一行,我们该如何实现它。

1 个答案:

答案 0 :(得分:4)

假设您的滚动窗口覆盖3个字节,并且我们的输入字符串为5个字节。 考虑字符串23456.我们将使用一个简单的散列函数:如果窗口覆盖字节a,b和c,那么散列是x 100 + b x 10 + c。

因此,对于我们的输入字符串2345,前3个字节的校验和是2 x 100 + 3 x 10 + 4 = 234。

接下来,窗口向左移动一步,现在覆盖3,4和5。我们可以使用之前的校验和以及我们对刚刚输入的数字的知识,而不是计算3 x 100 + 4 x 10 + 5,分别离开窗口5和2。

所以,我们知道2刚离开窗口,我们从234减去2 x 100,得到34.乘以34乘以10并加5。这给了我们新的散列345,而不必迭代所有的新窗口中显示的元素。对于下一个字节序列,我们可以使用相同的方法,并通过迭代窗口中的所有字节来避免计算哈希值。