gpt4 book ai didi

python - adler32滚动校验和计算的差异 - python

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:04 27 4
gpt4 key购买 nike

在查看计算运行校验和时需要澄清。

假设我有这样的数据。

data = 'helloworld'

假设 block 大小为 5,我需要计算运行校验和。

>>> zlib.adler32('hello')
103547413
>>> zlib.adler32('ellow')
105316900

根据 Python 文档(python 版本 2.7.2)

zlib.adler32(data[, value])

"Computes a Adler-32 checksum of data. (An Adler-32 checksum is almost as reliable as a CRC32 but can be computed much more quickly.) If value is present, it is used as the starting value of the checksum; otherwise, a fixed default value is used. This allows computing a running checksum over the concatenation of several inputs."

但是当我提供这样的东西时,

>>> 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 函数的滚动属性?

最佳答案

adler32() 函数不提供“滚动”。文档正确地使用了“运行”(而不是“滚动”)一词,这意味着它可以分块计算 adler32,而不是一次全部计算。您需要编写自己的代码来计算“滚动”adler32 值,这将是数据上滑动窗口的 adler32。

关于python - adler32滚动校验和计算的差异 - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9699315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com