比方说:
a
是一个包含随机字节的 256 MB 文件b
是同一个文件,只是多了一个前导字节0
感谢这个答案,我发现rsync
能够计算这两个文件之间的“二进制差异补丁”:
rsync --only-write-batch=patch b a
在这个例子中,patch
文件是......只有 65 KB,所以非常好。
总之,rsync
detect这么少的byes怎么改的?我最初认为它会比较:
- 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
?
也许更了解这一点的人可以发布另一个答案,但经过进一步研究,rsync 算法的关键似乎在“确定文件的哪些部分已更改”段落中有详细说明:滚动哈希。
另一个有用的阅读:https ://moinakg.wordpress.com/tag/rolling-hash/
与:
另一个有用的资源:http ://tutorials.jenkov.com/rsync/overview.html