在计算运行校验和时需要澄清。adler32滚动校验和的计算差异 - python
假设我有这样的数据。
data = 'helloworld'
假设块大小为5,我需要计算运行校验和。
>>> zlib.adler32('hello')
103547413
>>> zlib.adler32('ellow')
105316900
根据Python文档(Python版本2.7.2)
zlib.adler32(data[, value])
“计算数据的一个阿德勒-32校验和。(一种阿德勒-32校验和几乎是 作为可靠CRC32,但可以更快计算)如果存在 值,则将其用作校验和的起始值;否则将使用固定的默认值,这允许计算一个 在多个i nputs“。
但是当我提供了这样的事情,
>>> 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函数的滚动属性?
谢谢。但是,我想我正在寻找滚动校验和的差异。就你而言,我得到的是'world'的校验和,我感兴趣的是使用'hello'的校验和计算'ellow'的校验和。两者之间的区别是'h'被删除,'w'被添加。如果我不清楚,请告诉我。 – 2012-03-14 12:14:47