比方说:
a
是一个包含随机字节的 256 MB 文件b
是个相同的文件除了它有一个额外的前导字节0
多亏了这个回答,我发现rsync
能够计算这两个文件之间的“二进制差异补丁”:
rsync --only-write-batch=patch b a
在这个例子中,patch
文件......只有 65 KB,所以它非常好。
简而言之,如何rsync
检测到如此少的轮空被改变?我最初认为它会比较:
- a[0:k] 和 b[0:k]
- a[k+1:2k] 和 b[k+1:2k]
- a[2k+1:3k] 和 b[2k+1:3k]
- ...
- a[Nk:N] 和 b[Nk:N]
对于不同的 k 值,例如 2 可能的最大幂 (2^j),如果不匹配,则为 2^(j-1),然后为 2^(j-2),依此类推。
但对于这些文件a
和b
,它会完全失败,因为由于b
只a
移动了一个字节,所以根本不会有类似的块!那么我们预计将patch
是... 256 MB。
但这里它以一种更聪明的方式工作,在这个简单的例子中算法是如何工作的b
=一个字节与 的内容连接a
?
答案1
也许更了解这一点的人可以发布另一个答案,但经过进一步研究,rsync算法中的关键似乎在段落中有详细说明“确定文件的哪些部分已更改”:滚动哈希。
另一个有用的读物:https://moinakg.wordpress.com/tag/rolling-hash/
对比: