滚动校验 rolling checksum 的计算结果为何不对?

spirit_of_cloud 2014-04-23 02:42:48
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)值可能会很大,这样
就出现负数了,导致最终结果不正确。
可是这个算法已经是业界标准了,为何还会有这种问题,请高人指教,是不是我哪里搞错了,或者还缺了什么
...全文
410 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
听风看云 2016-03-19
  • 打赏
  • 举报
回复
同求!! lz解决了这个问题吗?
spirit_of_cloud 2014-04-24
  • 打赏
  • 举报
回复
没有大神吗?

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧