当前位置: 首页 > news >正文

Rsync滚动校验算法

Rsync中使用了一种滚动检验(Rolling Checksum)算法,用于快速计算数据块的检验值。它是一种弱校验算法,采用的是Mark Adler的adler-32校验,它的定义如下:

a(k, l) = (∑Xi) mod M

b(k, l) = (∑(l - i +1)Xi) mod M

s(k, l) = a(k, l) + 216b(k, l)

上面公式中,s(k, l)表示数据块Xk, ..., Xl的滚动校验值,为了简化以及计算速度考虑,M取值为216。这种校验计算公式具有一个非常关键的特性,那就是后续校验值可以通过递推关系高效地计算获得。

a(k+1, l+1) = (a(k, l) - Xk + Xl+1)) mod M

b(k+1, l+1) = (b(k, l) - (l - k +1)Xk + a(k+1, l+1)) mod M

s(k+1, l+1) = a(k+1, l+1) + 216b(k+1, l+1)

因此,给定X1, ..., Xn的校验值,X1以及Xn+1,我们就可以快速地计算出X2, ..., Xn+1校验值。这样,利用这种性质我们就可以高效地计算数据块连续校验值,大幅减少checksum计算量。dedup util中,我在CDC和Sliding-block文件分块处理中使用了该校验值算法,性能得到大幅提升。

附Adler32_checksum算法实现:

/* * a simple 32 bit checksum that can be upadted from either end * (inspired by Mark Adler's Adler-32 checksum) */ unsigned int adler32_checksum(char *buf, int len) { int i; unsigned int 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] + 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); } /* * adler32_checksum(X0, ..., Xn), X0, Xn+1 ----> adler32_checksum(X1, ..., Xn+1) * where csum is adler32_checksum(X0, ..., Xn), c1 is X0, c2 is Xn+1 */ unsigned int adler32_rolling_checksum(unsigned int csum, int len, char c1, char c2) { unsigned int s1, s2, s11, s22; s1 = csum & 0xffff; s2 = csum >> 16; s1 -= (c1 - c2); s2 -= (len * c1 - s1); return (s1 & 0xffff) + (s2 << 16); }

相关文章:

  • 中国宅客网一周年 晒照片赢大奖
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • 数据源绑定控件
  • 系统动力学软件vensim学习系列
  • 运用 GConf Cleaner 整顿 GConf
  • Qt/Embedded嵌入式开发环境的建立
  • 在嵌入式Linux情形下制造QPF字库的举措
  • Xvidcap:屏幕录像机
  • GrubED-Grub 编辑脚本
  • Google Earth 4.3 beta 界面字体增年夜术
  • Oracle根蒂根基知识
  • 使用SQL语句中between and查询数据出错
  • 网络编程[31]
  • 设置数据库兼容级别的两种方法
  • wordpress之模板汉化
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • angular组件开发
  • javascript 哈希表
  • Javascript设计模式学习之Observer(观察者)模式
  • JS笔记四:作用域、变量(函数)提升
  • SpriteKit 技巧之添加背景图片
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 目录与文件属性:编写ls
  • 突破自己的技术思维
  • 以太坊客户端Geth命令参数详解
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ​力扣解法汇总946-验证栈序列
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #DBA杂记1
  • (11)MATLAB PCA+SVM 人脸识别
  • (TOJ2804)Even? Odd?
  • (待修改)PyG安装步骤
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (七)c52学习之旅-中断
  • (七)Java对象在Hibernate持久化层的状态
  • (三)模仿学习-Action数据的模仿
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一) springboot详细介绍
  • (一)80c52学习之旅-起始篇
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net/c# memcached 获取所有缓存键(keys)
  • .net6 webapi log4net完整配置使用流程
  • .Net中wcf服务生成及调用
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [2023-年度总结]凡是过往,皆为序章