Как алгоритм rsync правильно идентифицирует повторяющиеся блоки? - PullRequest
7 голосов
/ 01 апреля 2010

Я нахожусь в личном стремлении узнать, как работает алгоритм rsync. После некоторых размышлений и размышлений у меня возникла ситуация, когда я думаю, что алгоритм не работает. Я пытаюсь выяснить, как это решается в реальной реализации.

Рассмотрим этот пример, где A - получатель, а B - отправитель.

A = abcde1234512345fghij
B = abcde12345fghij

Как видите, единственное изменение состоит в том, что 12345 был удален.

Теперь, чтобы сделать этот пример интересным, давайте выберем размер блока 5 байтов (символов). Хэширование значений на стороне отправителя с использованием слабой контрольной суммы дает следующий список значений.

abcde|12345|fghij

abcde -> 495
12345 -> 255
fghij -> 520

values = [495, 255, 520]

Далее мы проверяем, отличаются ли какие-либо значения хеш-функции от A. Если есть соответствующий блок, мы можем перейти к концу этого блока для следующей проверки. Если есть несоответствующий блок, то мы нашли разницу. Я шагну через этот процесс.

  1. Хэш первого блока. Существует ли этот хэш в списке значений? abcde -> 495 (да, так что пропустите)
  2. Хэш второго блока. Существует ли этот хэш в списке значений? 12345 -> 255 (да, так что пропустите)
  3. Хэш третьего блока. Существует ли этот хэш в списке значений? 12345 -> 255 (да, так что пропустите)
  4. Хэш четвертого блока. Существует ли этот хэш в списке значений? fghij -> 520 (да, так что пропустите)
  5. Нет больше данных, все готово.

Так как каждый хеш был найден в списке значений, мы заключаем, что A и B одинаковы. Что, по моему скромному мнению, не соответствует действительности.

Мне кажется, это произойдет, когда существует более одного блока с одним и тем же хешем. Я знаю, что пропустил этап вычисления и проверки сильного хэша, но это не будет иметь значения, так как второй и третий блоки абсолютно одинаковы

Что мне не хватает?

1 Ответ

6 голосов
/ 01 апреля 2010

Алгоритм rsync отправляет две контрольные суммы: по одной для каждого чанка и «скользящую» контрольную сумму для всего файла. В вашем примере A увидит разницу в скользящей контрольной сумме, когда доберется до блока «удвоения».

...