Лучший способ определить измененные данные в C ++
-
03-07-2019 - |
Вопрос
Мне нужно написать инструмент на C ++ для определения измененных битов в файле по сравнению с другим файлом для репликации. Каков наилучший способ достижения этого?
У меня нет конкретной ОС или библиотеки, я открыт для предложений. Моя основная задача - уменьшить объем сетевого трафика, участвующего в репликации.
Решение
Посмотрите на rsync - он разбивает файл на блоки, вычисляет контрольную сумму для каждого блока и передает только контрольную сумму, чтобы определить, есть ли какие-либо изменения в месте назначения перед передачей данных блока, только если это необходимо.
Другие советы
Если вы не можете использовать rsync как есть, проверьте librsync . Он старый, но код легко читается и улучшается.
Если у вас нет старой и новой версий файлов на одном компьютере, то rsync-подобные алгоритмы - это путь вперед (см. предыдущие ответы). Если у вас есть и старая, и новая версии файлов на одном компьютере, вы можете сделать это лучше, чем rsync: создавать сжатые файлы различий и отправлять их по сети.
Для создания эффективных различий взгляните на двоичное дельта-сжатие VCDIFF (RFC 3284). Хорошей реализацией является xdelta (www.xdelta.org). Реализовать декодер / декомпрессор довольно легко, если вы хотите избежать использования xdelta на принимающей стороне из-за проблем с лицензией. Написание собственного генератора различий VCDIFF, который будет генерировать компактные разности, намного сложнее (например, поиск перемещенных блоков).
В VCDIFF различия также могут быть без исходного кода, то есть они распаковываются в целевой файл без исходного файла (файла, к которому применяется diff) - в VCDIFF сжатие файла является особым случаем создания сжатого файла. дельта между двумя файлами. Это полезно, потому что вы можете использовать один и тот же формат независимо от того, имеет ли место назначения версию вашего файла.
Я бы начал с некоторой реализации diff ( http://en.wikipedia.org/wiki / Diff ) р>
предложение: используйте хэш-функцию & amp; разделить & amp; победить подход, чтобы сузить блок изменений. Не совсем решение для защиты от столкновений, но SHA-2 IMO может работать на вас.