実行中のチェックサムの計算を見ながら明確にする必要があります。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であるが、はるかに速く計算することができる)。 値が存在する場合、それはチェックサムの開始値として使用される; それ以外の場合、固定のデフォルト値が使用される。 実行中のチェックサムは、 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
は、私はあなたがローリングチェックサムとPythonの私の実装では、いくつかの大きな違いは、価値の面で、そこにある見ることができるように、これらの機能
Weak for hello: 103547413
Rolling for ellow: 105382436
Weak for ellow: 105316900
を実行しているから取得した値です。
ここで、ローリングチェックサムの計算に間違っていますか? 私はpythonのadler32関数のローリングプロパティを正しく使用していますか?
ありがとう。しかし、私はローリングチェックサムの場合の違いを探していると思います。あなたの場合、私が得るのは「世界」のチェックサムです。興味のあるのは、「hello」のチェックサムを使って「ellow」のチェックサムを計算することです。 2つの違いは、 'h'が削除され、 'w'が追加されます。私が明確でないかどうか教えてください。 –