在 wiki 上有比较详细的解释 以下大部分解释来自 wiki 上的说明
- 一个 adler-32 checksum 是由两个 16bit checksum A 与 B 组合而成的 32bit 的数
- A 初始化为 1 B 初始化为 0
- A是需要计算的字符串中每一个字符相加的值 并且对 65521 取模
- B是每一步中A的值相加 并且对 65521 取模
- 65521 是 2^16 内的最大质数
- 用途
- adler32 checksum 在 zlib 库中被广泛的使用
- 在rsync utility 中也有使用 rolling checksum
具体的伪代码如下 D 是需要进行adler32计算的字符串(string of bytes) n 是 D 的长度
A = 1 + D1 + D2 + D3 + ... + Dn (mod 65521)
B = (1 + D1) + (1 + D1 + D2) + ... + (1 + D1 + D2 + ... + Dn) (mod 65521)
↓↓↓ 等价于下面
B = n * D1 + (n - 1) * D2 + (n - 2) * D3 + ... + Dn + n (mod 65521)
Adler-32(D) = B * 65535 + A
wiki上给出的C实现实例如下adler32函数所示 基本和伪代码一致
#include <iostream>
using namespace std;
const uint32_t MOD_ADLER = 65521;
uint32_t adler32(unsigned char *data, size_t len)
{
uint32_t a = 1, b = 0;
size_t index;
for (index = 0; index < len; ++index)
{
a = (a + data[index]) % MOD_ADLER;
b = (b + a) % MOD_ADLER;
}
return (b << 16) | a;
}
int main(int argc,