Delta算法

 

Delta算法,最近工作需要做了方面的算法,这是个经典的二进制文件比较算法.由<<Andrew Tridgell - Efficient Algorithms for Sorting and Synchronization>>论文来的.


两个计算机A,B连接. 开始传输前有文件ai大小,B上bi大的文件,假定0<i<n. 所有每个文件n个bytes。算法目标是B收到A文件的拷贝。

基本的结构和远程更新算法


1)B发送bi一些数据S 到A

2)A值ai上匹配送来的数据,并发送数据D到B

3)B用bi,S,D重新建立新文件


---------------------------------------------


1)B机器上分割bi成N个大小相等的块bj和签名Sj

2)B机器上分割ai成N个大小相等的块ak和签名S k

3)A去搜索Sj在B上的Sk签名

4)每一个k,A发送在B匹配的A的数据块j,或者逐个ak

5)


这上面的算法很简单,实际上基本没用。A只能在块范围找到匹配。一种情况是在文件最前头插入一位,那么,将没有一个块可以匹配。


-----------------------------------------


解决这个问题,我们不单纯产生块边界的签名,而是所有byte边界.

例如: 签名可以在每块的前4个byte,这个将会比较容易计算,但是这算法会失败,通常情况不同的块有4个byte


-------------------------------------------


解决方法: 使用两个签名,第一个签名需要简单低成本计算偏移字节,第二签名必须强无冲突.

成本高的签字只需要通过A在B匹配了廉价签字的偏移字节计算...

两个签名R和H


1)B机器将分割bi成N个大小相等的块bj, 每块签名Rj和Hj,这些签名发到A

2)从ai上的开始每个字节偏移i计算Ri

3)A比较Ri和B的Rj

4)每个Ri匹配Rj的j,A计算Hi然后比较Hj

5)Hi匹配Hj, A发送token到B指示一块匹配,那一块匹配,,否则A发送a literalbyteto到B

6)B接受literal byteto然后从A取回和使用这些构造ai


快速签名是防止过度使用强签名.最重要的是能成本低计算一个文件每一位的偏移.

第一个快速签名算法是每块前后4个byte的串联 ,尽管能工作,但是失败严重.如某些结构数据文件(如tar文件)块字节子集样本,这就提供了糟糕的签名算法。但是在文件中找到适当大的字节块偏移有一个同样的签名它并不常见,

快速签名算法依赖一块中的字节,需要一些计算找到签名值,可能最简单的算法是字节求和。我们可以滑动一个块,减掉块前面的字节,加块后续字节,获取和。该算法问题是不依赖字节顺序,但减掉的值和加入的值相同导致签名相同。


解决这个问题是让签名顺序依赖引入因子(依赖i位置)来签名。算法定义如下



但A接受B的签名列表,它必须搜索ai任何偏移的任何块匹配B上的块签名。基本的策略是依次计算块的字节偏移的快速签名,去搜索B的签名列表匹配。

第一步的算法是排序接受到的签名,通过16位的哈希。16位的哈希索引表形成,一个16位的哈希值和给定的索引到排序签名表指向在匹配哈希表中第一个入口。一旦排序的签名表和表索引形成,签名搜索可以开始。在ai的每个byte偏移的快速签名是计算带有16位签名哈希值签名,给定索引值可以判定签名存在。

下面执行线性搜索签名表,当不匹配的16位哈希值签名表中找到。每项32位开始签名



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值