在 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, char *argv[])
{unsigned char *data;data = (unsigned char *)("Wikipedia");adler32(data, 9);return 1;
}

在 rsync 中的checksum方法如下

/*a simple 32 bit checksum that can be upadted from either end(inspired by Mark Adler's Adler-32 checksum)*/
uint32 get_checksum1(char *buf1, int32 len)
{int32 i;uint32 s1, s2;schar *buf = (schar *)buf1;s1 = s2 = 0;for (i = 0; i < (len-4); i+=4) {s2 += 4*(s1 + buf[i]) + 3*buf[i+1] + 2*buf[i+2] + buf[i+3] +10*CHAR_OFFSET;s1 += (buf[i+0] + buf[i+1] + buf[i+2] + buf[i+3] + 4*CHAR_OFFSET);}for (; i < len; i++) {s1 += (buf[i]+CHAR_OFFSET); s2 += s1;}return (s1 & 0xffff) + (s2 << 16);
}// 其中 schar 和 CHAR_OFFSET 的定义在 rsync.h 中如下 #ifdef SIGNED_CHAR_OK
#define schar signed char
#else
#define schar char
#endif/* a non-zero CHAR_OFFSET makes the rolling sum stronger, but isincompatible with older versions :-( */
#define CHAR_OFFSET 0

阅读代码发现 只有 A 的初始值从 1 变成了 0 不一样
根据定义稍微简化一下如下 并加以测试

uint32_t get_checksum(const char *buf, uint32_t len)
{uint32_t i;uint32_t s1, s2;s1 = s2 = 0;for (i = 0; i < (len - 4); i += 4){s2 += 4 * (s1 + buf[i]) + 3 * buf[i + 1] + 2 * buf[i + 2] + buf[i + 3];s1 += (buf[i + 0] + buf[i + 1] + buf[i + 2] + buf[i + 3]);}for (; i < len; i++){s1 += buf[i];s2 += s1;}return (s1 & 0xffff) + (s2 << 16);
}int main(int argc, char *argv[])
{unsigned char *data;data = (unsigned char *)("Wikipedia");adler32(data, 9);get_checksum("Wikipedia", 9);return 1;
}

由于初始化是 A 初始化为 0 所以计算出来的 A B 两个值有差异 以上面的测试来说 A 相差 1 B 相差 9
如果初始化为 s1=1,s2=0 那么结果将完全一致

checksum algorithm adler32相关推荐

  1. java alder32_Java里面计算Adler32校验

    虽然用过很多语言,觉得语言都不会是大问题.其实用起来,很多细节都不好把握的.所以编程语言虽然都长的很像的,但是一定要像<代码大全>里的说的,要programming in.今天用Java计 ...

  2. A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHM

    http://www.repairfaq.org/filipg/LINK/F_crc_v31.html#CRCV_001 A PAINLESS GUIDE TO CRC ERROR DETECTION ...

  3. linux内核 checksum,Linux内核分析 - 网络[十三]:校验和

    内核版本:2.6.34 报文的IP校验和.ICMP校验和.TCP/UDP校验和使用相同的算法,在RFC1071中定义,网上这方面的资料和例子很多,就不解释算法流程了,而是侧重于在实现的变化和技巧. T ...

  4. checksum java_Checksum getChecksum()

    Checksum getChecksum() 描述 (Description) java.util.zip.Adler32.update(int b)方法使用指定的字节(参数b的低八位java.uti ...

  5. Zookeeper源码解析 -- 本地事务日志持久化之FileTxnLog

    序言 在各个分布式组件中,持久化数据到本地的思想并不少见,为的是能保存内存中的数据,以及重启后能够重载上次内存状态的值.那么如何行之有效的进行,内存数据持久化到磁盘,怎么样的落盘策略合适,怎么设计持久 ...

  6. zlib.hpp封装

    // zlib.hpp : 定义控制台应用程序的入口点. // #include <stdio.h> /*  * If you *really* need a unique prefix ...

  7. hadoop命令帮助

    安装完hadoop后,在hadoop的bin目录下有一系列命令: container-executor hadoop hadoop.cmd hdfs hdfs.cmd mapred mapred.cm ...

  8. HBase 默认配置项详细解读

    hbase-site.xml和hbase-default.xml 在Hadoop中将特定于站点的HDFS配置添加到hdfs-site.xml文件,那么对于HBase,特定于站点的配置文件为conf/h ...

  9. MySQL5.6 选项和变量整理

    MySQL5.6 选项和变量整理   --allow-suspicious-udfs 这个选项控制是否用户定义函数只有一个xxx符号用于主函数加载.默认,该选项是关闭并且只具有至少一个辅助符号的UDF ...

最新文章

  1. vibe前景提取算法示例代码
  2. 虚拟桌面环境需要一个什么样的接入网络?
  3. 关于MySQL count(distinct) 逻辑的另一个bug
  4. 想做网络推广教你如何快速通过SEO考核期呢?
  5. 网易智慧企业 Node.js 实践(2)| 平滑发布和前端代码
  6. getchar()和EOF
  7. 自己写了一个多行文本溢出文字补全的小库, 说不定你会用得到的
  8. 如何编程两个android 手机进行通信_100+ 队伍激烈角逐 Geek Online 2020 编程挑战赛完美收官 - 业界动态...
  9. es6 实例:模块的 Singleton 模式
  10. 数学的记号(notation)
  11. Java基础:Lambda表达式
  12. Adaptive Platform AUTOSAR(AP)平台的四个基本概念
  13. 回溯策略的汉诺塔问题
  14. wifi的html页面,aWiFi是什么?
  15. 水果店差别定价策略,水果店的单品定价公式
  16. java----正则表达式
  17. 2021年焊工(初级)报名考试及焊工(初级)新版试题
  18. java partial class_easymock教程-partial class mocking
  19. 搜查令——项目个人总结+个人自评
  20. JAVA Web day01--- Android小白的第一天学习笔记

热门文章

  1. SQL查询优化——数据结构设计
  2. 华硕 PRIME X570-Pro+AMD Ryzen 7 3700X + macos12.0+oc7.1
  3. Linux 通过yum源安装subversion(svn)服务端
  4. Linux顺序表实现,通过选择实现插入、查找、排序等功能
  5. SIM 卡接口电平转换
  6. 罗斯蒙特流量计工作原理
  7. Arxiv 2209 | Switchable Self-attention Module
  8. linux du | sort 命令查找磁盘占用大户
  9. Windows 10 20H2正式版尝鲜
  10. 微信文件删除了怎么恢复,3个实用有用的方法