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

原创 2013年05月31日 23:23:45
开源我的基于字节的数据补丁算法库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在源代码共享和协作开发方面比以前的方式方便和安全了很多,我的一些'有趣'或可能算有点儿用的代码也会陆续放上去 )


 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDiffPatch和BsDiff4.3&xdelta3.1的对比测试

HDiffPatch和BsDiff4.3&xdelta3.1的对比测试 HDiff比BsDiff 生成的diff数据更小(一般小15%以上),速度更快(一般只需要1/4多时间),占用内存更小(一般只...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

diff程序的算法

diff程序很重要,linux中的源代码补丁都是diff作出来的,diff在比较两个文本文件的不同方面很高效,它是基于行的,diff会将两个文件都按照行分成若干部分,然后计算这些行每一行的校验码,之后...
  • dog250
  • dog250
  • 2010年02月09日 21:46
  • 6667

一个高效的二进制数据补丁算法

一个高效的二进制数据补丁算法(原创) 作者: HouSisong@GMail.com   2006.04.11 tag:补丁,patch,补丁算法,后缀数组 (2013-05-31:...

openssl生成公钥私钥对 加解密

在计算机软件开发世界中,编程语言种类极多,数据在各种语言的表现形式可能有所差异,但数据本身的处理可能,或者说本质上是完全一样的;比如数据在某个算法中的运算过程是一样的。在这里,我以加密与解密来作为例子...

一个高效的二进制数据补丁算法2009-07-19 21:09

一个高效的二进制数据补丁算法作者: HouSisong@GMail.com   2006.04.11tag:补丁,patch,补丁算法,后缀数组     补丁算法在很多地方都很有用,可以用来制作发布软...
  • windeer
  • windeer
  • 2011年07月21日 21:10
  • 363

深入C语言之字节对齐 - [C 数据结构 算法]

在C程序设计中我们经常需要用到一种数据类型的长度(占内存的字节数),例如:    int *p = NULL;    p = (int *)malloc(10*sizeof(int));/*用...

PIC多字节无符号数减法的算法

  • 2013年12月11日 10:32
  • 12KB
  • 下载

半字节压缩/解压算法[Java]

  • 2014年05月22日 12:45
  • 5KB
  • 下载

【线性规划与网络流24题 12】软件补丁 最短路算法

【线性规划与网络流24题 12】软件补丁 Description T 公司发现其研制的一个软件中有n 个错误,随即为该软件发放了一批共m 个补丁程序。每一个补丁程序都有其特定的适用环境,某个补丁只...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:开源我的基于字节的数据补丁算法库HDiffPatch
举报原因:
原因补充:

(最多只允许输入30个字)