[差量更新系列2]Xdelta3原理学习笔记
Xdelta3是一种优秀的、被广泛使用的差量更新算法,它在操作上既有对新文件(targetfile)和旧文件(sourcefile)的差分(differencing)又有对产生的patch包进行压缩(compression),我们将产生patch包的过程统称为加密(encoding),而将合成新文件的过程统称为解密(decoding)。Xdelta3和经典的压缩算法LZ’77一样,也是将source file划分成一个个不相交而又连续的window,然后进行encoding和decoding。
设target file的大小为n,source file的大小为m,window的大小为w。由于Xdelta3在合成target file所消耗的时间为O(n),所消耗的内存大小为O(w),所以该压缩算法很适合被移植到手机中。
Xdelta3在产生patch包的时候,主要依靠三个方面:
1.采用Vcdiff格式编码,节省patch包字节;
2.从target file和source file的内容上做差分;
3.压缩patch包。
Vcdiff格式编码
这是一种基于字节的编码,可移植性强。采用128进制,用一个字节的低七位表示数字,最高位标记编码是否完成,如果没有编完,编码将扩展到下一个字节。如:
123456789
表示为128进制为:
58,111,26,21
在机器中表示如下:
+-------------------------------------------------------+
| 10111010 | 11101111 |10011010 | 00010101 |
+-------------------------------------------------------+
MSB+58 MSB+111 MSB+26 0+21
这里,原本要用9个字节,变成了4个字节。
Target file和Sourcefile的差分
我们用S表示sourcefile的字符串,长度为S_len,T表示targetfile的字符串。差分用到add,run,copy三种命令。Xdelta3中,差分的copy命令不但可以在S与T之间执行,还可以在T已被解压的部分和未被解压的部分执行。
ADD x,s: 将一个长度为x的字符串s拷贝到T的当前位置。
COPY x,y: 当y<S_len时,从S[y]拷贝x个字符到T的当前位置;
当y≥S_len时,从T[y-S_len]拷贝x个字符到T的当前位置。
RUN x,z:在T的当前位置加x个字符z。
我们给出例子如下:
Source file a b c d e f g h i j kl m n o p
Target file a b c d w x y z e f g h e f g h e f g h e f g h z z z z
COPY 4, 0
ADD 4, w x y z
COPY 4, 4
COPY 12, 24
RUN 4, z
对于第四条命令,由于S的长度为16, 拷贝指针c指向T中的位置24-16=8,T当前位置的指针p指向位置12,执行T[p++]=T[c++]12次。
压缩Patch包
由上一部分可知,patch包中的内容可以由一系列add,run,copy命令表示。为了使patch包更小,这些命令必须被更有效的压缩。为了使压缩效率更高,Xdelta3将patch中的内容分了三部分,数据