[差量更新系列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已被解压的部分和未被解压的部分执行。