문제

실행중인 체크섬 계산을보고있는 동안 설명이 필요합니다.

이와 같은 데이터가 있다고 가정합니다.

data = 'helloworld'
.

블록 크기가 5를 가정하면 실행중인 체크섬을 계산해야합니다.

>>> zlib.adler32('hello')
103547413
>>> zlib.adler32('ellow')
105316900
. 에 따르면
zlib.adler32(data[, value])
.

"adler-32 데이터 체크섬을 계산합니다. (Adler-32 체크섬은 거의 CRC32만큼 신뢰할 수 있지만 훨씬 더 빨리 계산할 수 있습니다.) if 값이 있으므로 체크섬의 시작 값으로 사용됩니다. 그렇지 않으면 고정 된 기본값이 사용됩니다. 이것은 컴퓨팅 A를 허용합니다 여러 입력의 연결에 대해 체크섬을 실행합니다. "

그러나이 같은 것을 제공 할 때,

>>> 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
.

볼 수 있으므로 롤링 체크섬 및 파이썬의 구현에 큰 차이가 있습니다.

롤링 체크섬을 계산할 때 나는 어디에서 틀렸습니까? 파이썬의 Adler32 기능의 롤링 속성을 올바르게 사용하고 있습니까?

도움이 되었습니까?

해결책

generacodicicetagcode 함수는 "롤링"을 제공하지 않습니다.이 문서는 "Running"( "롤링"이라는 단어)을 사용하여 한 번에 모두와 반대로 덩어리로 Adler32를 계산할 수 있음을 의미합니다.데이터를 통한 슬라이딩 창의 ADLER32가 될 "롤링"ADLER32 값을 계산하기 위해 자신의 코드를 작성해야합니다.

다른 팁

메소드 "롤링",

b = (b - (block_size * ord(removed)) + a) % MOD_VALUE
.

이어야합니다
b = (b - (block_size * ord(removed)) + a - 1) % MOD_VALUE
.

Wikipedia의 Adler32 알고리즘, 우리는 볼 수 있습니다 : 우리가 체크섬을 굴릴 때, 우리는 방정식을 가질 것입니다 :

A1 = (1 + D2 + D3 + … + Dn + Dn+1)(mod 65521)
= (1 + D1 + D2 + D3 + … + Dn) – D1 + Dn+1(mod 65521)
= A – D1 + Dn+1(mod 65521)
B1 = (1 + D2) + (1 + D2 + D3) + … + (1 + D2 + D3 + … + Dn + Dn+1)(mod 65521)
= (1 + D1) – D1 – 1 + (1 + D1 + D2) – D1 + ... +(1 + D1 + D2 + … + Dn) – D1 + (1 + D1 + D2 +      … + Dn + Dn+1) – D1(mod 65521)
= B – nD1 – 1 + A1 + D1 – D1(mod 65521)
= B – nD1 + A1 – 1(mod 65521)
.

그런데, DEF 롤링 ()은 적어도 모듈러 결과의 표시가 제과의 표시가있는 파이썬에서 적어도 정확합니다.예를 들어 C에서 %의 결과의 표시가 배당금의 표시가 있거나 구현이 정의 된 구현 인 경우는 다른 언어에서 작동하지 않을 수 있습니다.

모듈러스 65521에서 각 단계에서 얻을 수 있는지를 고려하여 알고리즘을보다 효율적으로 만들 수 있으며, 55521의 IF 및 추가 또는 추가 또는 뺄셈을 사용하여 %를 교체하거나, 충분한 데이터 유형을 사용하여동안 얼마나 드물게 당신은 그 이상을 피하기 위해 금액의 %로 %를 벗어날 수 있는지 알아보십시오.다시 말하면, 부정적인 배당금의 %에주의하십시오.

여기에 작동 함수가 있습니다.모드가 계산되는 단계에서 알아 두십시오.

def myadler32(data):
  a = 1
  b = 0
  for c in data:
      a += c
      b += a
  a %= MOD_ADLER
  b %= MOD_ADLER
  return b<<16 | a
.

테스트에서 Adler32 값을 잘못 계산했습니다.

>>> import zlib
>>> zlib.adler32("helloworld")
389415997
>>> zlib.adler32("world",zlib.adler32("hello"))
389415997
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top