开源我的基于字节的数据补丁算法库HDiffPatch

来源:互联网 发布:男式真皮鞋上淘宝 编辑:程序博客网 时间:2024/05/21 13:23
开源我的基于字节的数据补丁算法库HDiffPatch
作者: HouSisong@GMail.com   2013.05.31

tag: HDiffPatch,diff,patch,补丁


HDiffPatch是一个高效的diff/patch实现,比bsdiff更快(只需1/4时间),占用的内存更小(2/3内存),更容易使用和集成,得到的diff结果压缩后也经常比bsdiff更小或相当(一般小10%以上)!    (  google也在使用bsdiff; 网址: http://www.daemonology.net/bsdiff/  ; 我也是在google的开源代码中的第三方源码库中发现bsdiff的,也许早知道的话就不会自己写了 )

HDiffPatch使用很简单:
  1.create_diff(newData字节数组,oldData字节数组,out diffData);
      生成了oldData到newData的差异信息diffData;
  2. bool patch(out newData,oldData,diffData);
      用oldData和diffData就可以合成newData。
      (如果需要传输或网络下载,建议选择用LZMA或ZIP等压缩diffData;  )

HDiffPatch算法特性:
    HDiff算法时间复杂度O(newSize+oldSize),(只能算平均复杂度,妥协是为了优化内存占用),内存使用newSize+oldSize*5+O(1)字节;(oldSize>=2G时 newSize+oldSize*9+O(1)字节 )。
    HPatch算法时间复杂度O(newSize+oldSize),内存使用newSize+oldSize+O(1)字节; (特殊情况下可以使用patch_stream把O(n)空间消耗转嫁给硬盘,而消耗内存O(1))。

    bsdiff选择了zip来生成压缩的diff数据,而HDiff没有替用户选择,生成的数据还处于可压缩状态。这样处理很有好处,比如用户可以选择更好的压缩算法; 比如用户可以对多个oldData版本都相对于当前最新版本生成多个diff数据然后压缩成一个diff包,这样的话多版本diff数据就会非常小!

  (和bsdiff的详细对比测试:  http://blog.csdn.net/housisong/article/details/9037743 )


HDiffPatch的授权协议:
    HDiff使用的约束非常小的MIT协议(注意: HDiff库里使用的唯一第三方库"sais.hxx",应该也是该协议);
    HPatch使用的约束更小的协议,基本上只要拷贝或修改的源代码中不要删除原作者的版权申明信息就好(见源代码);

HDiffPatch的由来:
    我们的软件支持给大量客户端软件自动升级到最新版本; 为了减小需要下载的数据流量,只要传递版本之间的差异就可以了,这就有了做diff和patch算法的需求;  那时候试用过VPatch,后来(不确定先后)看到了后缀树和后缀数组算法,就想到一个算法实现,参见2006年的blog<一个高效的二进制数据补丁算法>;  
    HDiffPatch是去年在节假日时间重新按diff\ptach算法用C\C++代码实现了一个版本(以前的版本用Delphi写的,2份代码不是移植关系);   其中HDiff用的C++来实现的,HPatch为了更好的移植性完全用纯C语言实现;   所有代码在windows\macosx\linux,x86\x64\arm下都编译运行过;  (当然,环境所限,我没有在更多的系统和CPU体系下编译和运行)

HDiffPatch的开源计划:
    项目网址:  https://github.com/sisong/HDiffPatch 
    项目计划:  ( 没有明确的开发计划,大家用着高兴就好,作者很懒,可能是如下 )
      .更多环境和CPU体系的使用测试;
      .和其他更多diff/patch的对比测试;
      .英文版的源代码注释; (我的英语能力很差; readme文件都改了好多版! )
      .更大范围使用后的新需求 (比如提供  库提供选择使用LZMA或zip等压缩的diffData?  文件和文件夹级别的 diff/patch ?  自解压的patch+diffData包?  )

      .针对可执行程序文件的一个特殊优化算法的实现(相信会得到小得多的diff数据;但这样代码就和不同平台的可执行程序文件结构有相关性,比如windows平台需要处理PE文件结构...  ps:google有一个更激进彻底的算法设计: newExe和oldExe可执行程序分别反编译为伪源代码newCode和oldCode,对伪源代码做常规diff得到diffCode(可以选择进一步无损压缩),patch时oldExe反汇编得到oldCode,和diffCode执行常规patch得到newCode,编译newCode得到newExe(实现复杂度和细节应该不少). )


(ps: github在源代码共享和协作开发方面比以前的方式方便和安全了很多,我的一些'有趣'或可能算有点儿用的代码也会陆续放上去 )


 
原创粉丝点击