在这个简单的例子中,rsync 是如何工作的?

在这个简单的例子中,rsync 是如何工作的?

比方说:

  • 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),依此类推。

但对于这些文件ab,它会完全失败,因为由于ba移动了一个字节,所以根本不会有类似的块!那么我们预计将patch是... 256 MB。

但这里它以一种更聪明的方式工作,在这个简单的例子中算法是如何工作的b=一个字节与 的内容连接a

答案1

也许更了解这一点的人可以发布另一个答案,但经过进一步研究,rsync算法中的关键似乎在段落中有详细说明“确定文件的哪些部分已更改”:滚动哈希

另一个有用的读物​​:https://moinakg.wordpress.com/tag/rolling-hash/

对比:


另一个有用的资源:http://tutorials.jenkov.com/rsync/overview.html

相关内容