たとえば、
a
ランダムバイトを含む256MBファイル。b
~である同じファイル追加の先行バイトがあることを除いて、0
これのおかげで回答rsync
、次の2つのファイル間の「バイナリdiffパッチ」を計算する機能が見つかりました。
rsync --only-write-batch=patch b a
この例では、patch
ファイルは... 65KBにすぎないのでかなり良いです。
簡単に言えば、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
とその場合は1バイトしか移動されないため、同様のブロックがまったくないb
ため、完全に失敗します。もしそうなら、我々はそれが256MBになると予想します。b
a
patch
b
しかし、ここではよりスマートな方法で動作します。この単純な例(バイトがコンテンツに関連付けられている)では、アルゴリズムはどのように機能しますかa
?
答え1
これについてもっと知っている人は他の答えを投稿するかもしれませんが、追加の調査ではrsyncアルゴリズムの核心がその段落で詳しく説明されているようです。「ファイルのどの部分が変更されたかを確認する」:ローリングハッシュ。
もう一つの有用な材料:https://moinakg.wordpress.com/tag/rolling-hash/
比較:
もう一つの便利なリソース:http://tutorials.jenkov.com/rsync/overview.html