Требуется пояснение при рассмотрении расчета текущей контрольной суммы.
Предположим, у меня есть такие данные.
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, но может быть вычислен намного быстрее.) Если значение присутствует, оно используется в качестве начального значения контрольной суммы, в противном случае используется фиксированное значение по умолчанию. Это позволяет вычислить текущую контрольную сумму по объединению нескольких входов. "
Но когда я предоставляю что-то вроде этого,
>>> 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 в стоимостном выражении.
Где я ошибаюсь при вычислении скользящей контрольной суммы?Правильно ли я использую свойство rolling функции adler32 в Python?