校验和算法 Adler-32

一 简介

Adler-32是校验和 算法,由Mark Adler于1995年发明,是对Fletcher校验和算法的修改。相比较相同长度的循环冗余校验,它以可靠性换取速度。

二 算法

通过计算两个16位校验和A和B并将它们的位连接成32位整数来获得Adler-32校验和。A是流中所有字节加上1 的总和,B是每个步骤中A的各个值的总和。
在Adler-32运行开始时,A初始化为1,B初始化为0.总和以模数65521(小于216的最大素数)完成。字节以网络顺序(大端)存储,B占用两个最重要的字节。

三 举例

计算字符串Wikipedia。

A =  920 =  0x398  (base 16)
B = 4582 = 0x11E6
Output = 0x11E6 << 16 + 0x398 = 0x11E60398

四 实现

C语言实现

const uint32_t MOD_ADLER = 65521;
uint32_t adler32(unsigned char *data, size_t len) 
/* 
    where data is the location of the data in physical memory and 
    len is the length of the data in bytes 
*/
{
    uint32_t a = 1, b = 0;
    size_t index;
    
    // Process each byte of the data in order
    for (index = 0; index < len; ++index)
    {
        a = (a + data[index]) % MOD_ADLER;
        b = (b + a) % MOD_ADLER;
    }
    
    return (b << 16) | a;
}

五 优缺点

它在许多平台上比CRC-32更快。
与标准CRC-32一样,Adler-32校验和可以很容易地伪造,因此对于防止故意修改是不安全的。
Adler-32对于具有几百个字节的短消息校验较弱,因为这些消息的校验和对32个可用位的覆盖率较差。
Adler-32对于小的增量变化和公共前缀或者连续数字生成的字符串的校验也较弱。

六 参考

Adler-32 wiki

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值