【发布时间】:2012-03-30 18:08:34
【问题描述】:
在计算运行校验和时需要说明。
假设我有这样的数据。
data = 'helloworld'
假设块大小为 5,我需要计算运行校验和。
>>> zlib.adler32('hello')
103547413
>>> zlib.adler32('ellow')
105316900
根据 Python 文档(python 版本 2.7.2)
zlib.adler32(data[, value])
"计算数据的 Adler-32 校验和。(Adler-32 校验和几乎是 与 CRC32 一样可靠,但计算速度更快。)如果 value 存在,它被用作校验和的起始值; 否则,使用固定的默认值。这允许计算一个 对多个输入的串联运行校验和。”
但是当我提供这样的东西时,
>>> zlib.adler32('ellow', zlib.adler32('hello'))
383190072
输出完全不同。
我尝试创建一个自定义函数来生成 rsync 算法中定义的滚动校验和。
def weakchecksum(data):
a = 1
b = 0
for char in data:
a += (ord(char)) % MOD_VALUE
b += a % MOD_VALUE
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_VALUE
b = (b - (block_size * ord(removed)) + a) % MOD_VALUE
return (b << 16) | a
这是我通过运行这些函数得到的值
Weak for hello: 103547413
Rolling for ellow: 105382436
Weak for ellow: 105316900
如您所见,我的滚动校验和和 python 的实现在价值方面存在巨大差异。
我在计算滚动校验和时哪里出错了? 我是否正确利用了 python 的 adler32 函数的滚动属性?
【问题讨论】: