rsync核心算法介绍及应用探索

本文详细介绍了Rsync的核心算法,包括Adler-32和MD5校验,以及如何通过这两个校验来实现高效的文件差异化同步。Rsync利用分块CheckSum,通过Rolling CheckSum和MD5 Hash来找出文件差异,再通过查找和比对算法确定需要传输的数据,提高同步效率。此外,还讨论了Adler-32算法的优化和MD5的基本原理。
摘要由CSDN通过智能技术生成

Rsync核心算法

Rsync是unix/linux下同步文件的一个高效算法,它能同步更新两台计算机的文件与目录,并查找文件中的不同块以减少数据传输。Rsync的一个重要特性就是只对变更部分进行传送。rsync可拷贝、显示目录属性以及拷贝文件,并可选择性的压缩以及递归拷贝。Rsync是由Andrew Tridgell发明的。
Rsync要解决差异化同步,前提就必须知道源文件和目标文件之间的差异,特别是当源文件与目标文件分别位于两台计算机上时。
Rsync的算法流程:
1) 分块CheckSum算法:将目标文件按指定块大小平均分成若干块,然后对每块计算两个CheckSum值。涉及的两个算法如下:
a) Rolling CheckSum,32位,采用Adler-32算法;比较弱,碰撞几率高;
b) MD5 HASH,128位,强CheckSum,碰撞几率低;
显然,如果Rolling CheckSum 值不同,那么两个文件块肯定不同;但是,如果Rolling CheckSum 值相同,但因其高碰撞率我们无法确定两个文件块就是相同的,这时就需要进一步比较MD5的值了,毕竟MD5的碰撞几率达到2* 因此,可以说:Adler-32用来区别不同,而MD5用来进一步确认相同。
2) 目标文件的CheckSum计算完成后,接下来同步目标端就需要将这个CheckSum列表告诉给源文件端,给其提供一个差异检查的参照物。这个列表的每一项都包含以下三个信息:Rolling CheckSum、MD5、文件块号。同步源端拿到这个列表后,对源文件进行同样的CheckSum,然后对比,就可以知道哪些文件块发生了变化。仅仅如此简单吗?我们接着看下面这两个问题:
a) 如果在源文件中间插入了一个字符,其后的文件块都将偏移一个字符,显然和目标文件已经不同了,CheckSum信息也发生了改变。但从理论上将,我们应该只传输一个字符到目标端。怎么解决呢?
b) 如果目标文件很大,对应的CheckSum列表也将很长,在对源文件进行CheckSum比较时采用线性查找,显然比较慢。又该怎么办?
3) 查找算法。同步源端拿到目标文件的CheckSum列表后,将之存到一个Hash Table中,用Rolling Checksum做Hash-Key,以便获得O(1)时间复杂度的查找性能。这个Hash Table是16bits的,所以,Hash Table的大小是2^16,对Rolling Checksum的Hash会被散列到0 到 2^16 – 1中的某个整数值。显然,Hash表中的KEY会发生碰撞,我们只需要将碰撞的Checksum做成一个链表就可以了。
4) 比对算法。这是最关键的算法,细节如下:
a) 取源文件的第一个文件块(长度设为N),即从源文件的第1个字节到第N个字节计算Rolling CheckSum,然后到HASH表中查找;
b) 如果查到了,表明源文件与目标文件中有潜在相同的文件块;继续计算MD5并比较。如果Rolling checksum和MD5都相同,可确定相同文件块存在,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值