滚动校验 rolling checksum 的计算结果为何不对?
rolling checksum 的算法可以根据 1到n 的校验和计算出 2 到n+1 的校验和。
但是我用rolling计算出的结果有时会跟直接计算出的校验值结果不一致。
伪代码如下:
def weakchecksum(data):
a = 1
b = 0
for char in data:
a += (ord(char)) mod 65521
b += a mod 65521
return (b << 16) | a
def rolling(checksum, removed, added, block_size):
a = checksum
b = (a >> 16) & 0xffff
a &= 0xffff
a = (a - ord(removed) + ord(added)) mod 65521
b = (b - (block_size * ord(removed)) + a - 1) mod 65521
return (b << 16) | a
我猜测可能是这句 b = (b - (block_size * ord(removed)) + a - 1) % 65521 出的问题
因为 b在上一次计算的结果可能已经 Mod 过了,会变的很小,而block_size * ord(removed)值可能会很大,这样
就出现负数了,导致最终结果不正确。
可是这个算法已经是业界标准了,为何还会有这种问题,请高人指教,是不是我哪里搞错了,或者还缺了什么