在計算運行校驗和時需要澄清。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