Делать дельта-файл без базового (исходного) файла? - PullRequest
1 голос
/ 25 февраля 2012

(ОК, не кричите на меня, здесь очень поздно :))

Я исследую инструменты разностного различия (инструменты или компоненты командной строки, это не имеет значения, пока я могу позвонитьих от Delphi 2010 )

У меня есть этот проект, в который я загружаю файлы на сервер, мне нужно оптимизировать загрузку, и было бы здорово, если бы я мог загружать только дельта-файл вместоотправка нового файла, а затем сравнение обеих старых и новых версий файлов на сервере.

Я читал о Duplicity здесь

Duplicity - это разновидность rdiff-резервное копирование, которое позволяет выполнять резервное копирование без взаимодействия с сервером хранения, как с простыми сервисами хранения, такими как Amazon S3.Он работает, заранее генерируя хеши для каждого блока, шифруя их и сохраняя их на сервере, а затем извлекая их при инкрементном резервном копировании.Остальные данные также хранятся в зашифрованном виде в целях безопасности.

Это заставило меня задуматься, есть ли инструмент (или способ) для создания патча или дельта-файла (я не уверен, чтоправильный термин:) на основании нового файла, без , имеющего доступ к исходному файлу?

Я имею в виду, скажем, у меня есть этот файл, который я однажды изменил:

my-data.db
[ my-data.db ] modified       --> [ delta-file-1.diff ]

Есть ли способ создать [delta-file-1.diff] на основе нового файла без доступа к старому файлу?(может быть, путем сохранения какой-то подписи для исходного файла?)

Я много исследовал эту тему (rdiff, PatchAPI, ZDelta, XDelta, MSDelta и т. д.), но я не могу найтилюбой реальный рабочий пример по этому вопросу.

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

Сжатие цели без исходного файла

API-интерфейс исправлений Windows: сжатие цели без базового (исходного) файла

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 25 февраля 2012

Нет, вы не можете получить разницу от A и B без способа получить A и B.

Вы можете восстановить A из более старых версий A и применить различия.подпись А не срежет.

1 голос
/ 19 марта 2012

Для интересующихся: есть rdiff , который имеет порт Windows и может быть запущен из Delphi, и librsync , который, если я правильно понял, является движком позади rdiff. 1005 *

Оба требуют подписи старого файла (который на намного меньше, чем сам файл) и полного нового файла.

Обратную дельту можно сделать, чтобы получить новый файл от старого.

1 голос
/ 25 февраля 2012

Когда вы добавляете файл или редактируете его только в блоках известного размера (скорее всего, это невозможно для текстовых файлов), я думаю, что хеширование будет осуществимо.См. AICH eMule ( вики eMule / вики aMule ).

По сути, вы разбиваете файл на блоки размера N и вычисляете хеш-код каждого блока.Затем вы вычисляете «супер хэш» из M блоков.При таком подходе вы можете отслеживать измененные блоки без необходимости передачи большого количества метаданных.

В противном случае: вы не можете создать весь файл из diff, не зная базы, из которой был взят diff.Вы также не можете создать diff, не зная основы.

...