关闭

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

标签: HDiffPatchdiffpatchbsdiff
8414人阅读 评论(19) 收藏 举报
分类:
开源我的基于字节的数据补丁算法库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在源代码共享和协作开发方面比以前的方式方便和安全了很多,我的一些'有趣'或可能算有点儿用的代码也会陆续放上去 )


 
4
0
查看评论

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

HDiffPatch和BsDiff4.3&xdelta3.1的对比测试 HDiff比BsDiff 生成的diff数据更小(一般小15%以上),速度更快(一般只需要1/4多时间),占用内存更小(一般只需要2/3内存); 而在资源限制可能性更大的patch阶段,HPatch比BsP...
  • housisong
  • housisong
  • 2013-06-06 12:19
  • 8095

[差量更新系列1]BSDiff算法学习笔记

[差量更新系列1]BSDiff算法描述     BSDiff是一个差量更新算法,它在服务器端运行BSDiff算法产生patch包,在客户端运行BSPatch算法,将旧文件和patch包合成新文件。   差量更新算法的核心思想 尽可能多的利用ol...
  • add_ada
  • add_ada
  • 2016-04-24 12:12
  • 6878

关于binary diff / patch 差分补丁工具的那些事

差异工具 差异工具,其实就是·····有点难解释,看下面吧,相信你很快就懂了。 这个工具叫做binary diff / patch 顾名思义大概就是二进制比较和打补丁 看那个下划线就知道这个工具其实是有两个的。两个工具的作用: diff ...
  • Mr_xin321
  • Mr_xin321
  • 2016-01-03 21:00
  • 1991

补丁算法

  补丁算法在很多地方都很有用,可以用来制作发布软件的升级包、不同版本源代码的增量备份、数据的增量储存等等;这里介绍一种原创的高效的二进制数据补丁算法。 对于文本文件,按行来处理可能是一种直观的方案:求出新数据和老数据相比增加的行、删除的行、修改的行等等;但这种算法对于...
  • popkiler
  • popkiler
  • 2007-08-20 11:11
  • 675

三种打补丁方法

  • 2014-01-27 18:12
  • 94KB
  • 下载

Windows中使用bsdiff

bsdiff是一个差异包比较工具,可以用来实现Android的增量更新,详情请见这篇文章Android 增量更新完全解析 是增量不是热修复。只是这篇文章的背景是基于mac系统的,关于其第二步——增量文件的生成与合并——自己各种寻求编译方法,始终没能成功编译出bsdiff和bspatch文件。后来自己...
  • z191726501
  • z191726501
  • 2016-10-12 23:25
  • 2799

采用 bsdiff 开源库 Android 的增量更新,差分更新 服务器端&客户端

采用 bsdiff 开源库 Android 的增量更新,差分更新 服务器端&客户端
  • u014608640
  • u014608640
  • 2017-08-28 17:39
  • 446

Bsdiff增量更新实现

鸿大《Android 增量更新完全解析 是增量不是热修复》 wzben《呕心沥血Android studio使用JNI实例》 本来还想跟着鸿大的脚步,尝试自己编译Bsdiff的,无奈自己用的Win10,也没搭建Ubuntu虚拟机,网上搜索无果只能找了别人编译好的。 Demo ...
  • xFank
  • xFank
  • 2016-10-21 14:02
  • 743

bsdiff源码

bsdiff 源码 /*- * Copyright 2003-2005 Colin Percival * All rights reserved * * Redistribution and use in source and binary forms, with or with...
  • chence19871
  • chence19871
  • 2013-12-05 11:12
  • 2762

Diff程序的原理

使用版本控制工具CVS或者ClearCase中有merge的概念,而merge又是基于diff的,Linux/Unix下面的dif程序就能够获得两个文本文件的不同。Diff程序可以获得两个文本文件以行为单位的差异,基于LCS(Longest Common Subsequnece)算法。一个Subse...
  • wishfly
  • wishfly
  • 2008-01-14 13:03
  • 4155
    个人资料
    • 访问:571744次
    • 积分:6495
    • 等级:
    • 排名:第4422名
    • 原创:60篇
    • 转载:0篇
    • 译文:0篇
    • 评论:851条
    最新评论