Я нахожусь в личном стремлении узнать, как работает алгоритм rsync. После некоторых размышлений и размышлений у меня возникла ситуация, когда я думаю, что алгоритм не работает. Я пытаюсь выяснить, как это решается в реальной реализации.
Рассмотрим этот пример, где A - получатель, а B - отправитель.
A = abcde1234512345fghij
B = abcde12345fghij
Как видите, единственное изменение состоит в том, что 12345
был удален.
Теперь, чтобы сделать этот пример интересным, давайте выберем размер блока 5 байтов (символов). Хэширование значений на стороне отправителя с использованием слабой контрольной суммы дает следующий список значений.
abcde|12345|fghij
abcde -> 495
12345 -> 255
fghij -> 520
values = [495, 255, 520]
Далее мы проверяем, отличаются ли какие-либо значения хеш-функции от A. Если есть соответствующий блок, мы можем перейти к концу этого блока для следующей проверки. Если есть несоответствующий блок, то мы нашли разницу. Я шагну через этот процесс.
- Хэш первого блока. Существует ли этот хэш в списке значений?
abcde -> 495
(да, так что пропустите)
- Хэш второго блока. Существует ли этот хэш в списке значений?
12345 -> 255
(да, так что пропустите)
- Хэш третьего блока. Существует ли этот хэш в списке значений?
12345 -> 255
(да, так что пропустите)
- Хэш четвертого блока. Существует ли этот хэш в списке значений?
fghij -> 520
(да, так что пропустите)
- Нет больше данных, все готово.
Так как каждый хеш был найден в списке значений, мы заключаем, что A и B одинаковы. Что, по моему скромному мнению, не соответствует действительности.
Мне кажется, это произойдет, когда существует более одного блока с одним и тем же хешем. Я знаю, что пропустил этап вычисления и проверки сильного хэша, но это не будет иметь значения, так как второй и третий блоки абсолютно одинаковы
Что мне не хватает?