文件差异拷贝实现部署
第一部分 概述
一、校验码方案
弱校验(WC):快速hash函数(码大小:4字节)
强校验(SC):Crc16校验(码大小:2字节)
二、数据块大小定义
Ø 基准 100M 文件:WC块大小为1000字节;SC块大小为10000字节
Ø 对于 1G , 10G , 10M 文件:基准大小*(文件大小/基准文件)
三、hash码排序
Ø hash索引排序:WC(高16+低16)/2
三、索引组织方式与存储方式
Ø 用链表形式组织,组织方式如图1 所示:
13582 |
23582 |
… |
…. |
60223 |
5#16#104#3563#........... |
121#163#1034#35363#........... |
1321#1633#10334#333623#........... |
每个索引存有一个字符指针,保存了相同散列值的WC码的位置,每个位置都用#符隔开,在实际执行比对前将该结构导入内存,提高执行效率。
四、码文件组织形式
Ø 每10个WC后跟1个SC,将索引追加到文件末尾。
五、辅助结构
Ø 文件当前位置指针CurrentPtr
Ø 查找浮标指针FlowPtr
Ø 码文件当前指针NowPtr
Ø 码文件查找指针SearchPtr
Ø 时间信号量TimeSign
Ø 结果信息链表InfoList
Ø 索引链表计数器IndexCount
Ø 跳跃计数器JumpCount
Ø 中断信号量BreakSign
六、涉及的算法
Ø 二分插入
Ø 二分查找
Ø [C1*((squart(5)-1)/2)exp(n)+C2*((squart(5)+1)/2)exp(n)]跳跃
Ø 递归回溯
Ø 四向轮询hash
Ø 递归Crc强校验
七、文件比对
1)插入情形
当比对执行到有块对应的WC不一致时,执行轮询hash,每轮询hash一次,将生成的hash码执行索引hash,考虑当前的码文件位置以及文件的当前位置,将索引值相同的且在当前位置附近的源hash码取出对比,如果一样,然后再生成SC,与原SC进行对比如果一致,那么偏移量就是插入的字节数。否则,如果在比对完附近所有hash不一致或SC不一致后,则进行跳跃,在下一个跳跃出重复上述算法,直到最后一次跳跃结束或则文件结束。在每次跳跃查找比对成功后,执行回溯算法,将当前一致的前面所有WC与SC相同的块找出,直到回溯到有不相同的块偏移处,算出始末的偏移量就是要插入的块。
2)删除情形
比对当前WC时不一致,接下来算法与插入类似,没有附近hash码与原hash码匹配时,则将这些块定位为删除块,不足的块删除,然后再插入偏移字节。
3)替换情形
当比对hash码时候不同,其后的WC和SC都相同时候,就将该就是替换块。
4)追加情形
当旧文件已经比对结束,新文件没有时,将新文件末尾追加到旧文件。
5)截断情形
刚好与追加情形相反。
八、文件更新
用链表信息,新文件信息,旧文件重构文件,同时删除无用的信息。(考虑到性能使用文件内存映射)
九、新的码文件生成
根据新文件执行WC和SC,写入对应的码文件。
第二部分 结构图
差异拷贝模块层次模型图:
核心伪代码:
跳出条件:比对码时有一方没有码时
1)执行比对循环操作
跳出条件:没有原数据
2)执行新的码生成循环
21)将生成的码和旧的码比对
22)如果相等,继续;两者码偏移,当新的码没有时,生成后续
23)如果不相等
231)查看后续的3个码是否一致(包括CRC校验)
232)如果后续的3个码一致,则将该码前面的部分定位为替换
233)如果后续的3个码不一致,则执行轮循(从该码开始偏移一个字节)
234)将轮循的码和该码(以及后续3个)进行对比,如果相等,则比较后续的3个码是否一致,然后做Crc校验。(从0开始)
2341)如果比较一致,将前面的偏移量作为插入
2341)如果不一致则计算该轮询码的hash值,然后将hash码在hash表中查找,
23411)如果找到,则找到原code码,进行比较,如果不等,则继续下一个,如果都不相等,接着做下次轮询。
23411)如果相等,则取后续的比较,如果相等,则轮询结束,执行回溯,否则继续轮循。
234111)将当前位置前面的进行比对,知道有不一致的地方,结束。
23412)如果轮循到一定次数时候还没有匹配,则执行跳跃,在下一个位置,接着偏移量执行轮循。(跳到最远时,没有匹配的话,结束本轮轮询)
23413)比较两者偏移,确定删除,与插入的信息。
3)执行追加与截断情形
4)根据信息,将要插入的数据,以及替换的,追加的数据全部写入文件
5)将信息链表写入文件尾部
详细的文档可以通过用email发送,请留言与留下email地址
参考文献:高效查找与同步算法 作者:澳大利亚:Andrew Tridgell