Frage

Ich benötige ein Werkzeug in C ++ zu schreiben, um die geänderten Bits in einer Datei verglichen, eine andere Datei für die Replikation zu bestimmen. Was wäre die beste Methode, dies zu erreichen sein?

Ich habe kein bestimmtes O oder Bibliothek im Sinne habe, ich bin offen für Vorschläge. Mein primäres Ziel ist es, die Menge an Netzwerkverkehr in replizierenden beteiligt zu reduzieren.

War es hilfreich?

Lösung

Schauen Sie sich rsync - es teilt die Datei in Blöcke, berechnet eine Prüfsumme für jeden Block und überträgt nur die Prüfsumme, um festzustellen, ob es irgendwelche changesto das Ziel sind, bevor die Blockdaten nur bei Bedarf übertragen

.

Andere Tipps

Wenn Sie nicht rsync wie es ist, überprüfen librsync verwenden können. Es ist alt, aber der Code ist leicht zu lesen und zu verbessern.

Wenn Sie nicht über die alten und neuen Versionen von Dateien auf der gleichen Maschine, dann rsync-ähnliche Algorithmen sind der Weg nach vorn (siehe vorherige Antworten). Wenn Sie beide haben die alten und die neuen Versionen von Dateien auf der gleichen Maschine, können Sie dann besser abschneiden als rsync. Komprimiertes diffs erzeugen und sie über das Netzwerk senden

Für eine effiziente diffs zu erzeugen, hat einen Blick auf VCDIFF (RFC 3284) binärer Delta-Komprimierung. Eine gute Umsetzung ist xdelta (www.xdelta.org). Es ist ziemlich einfach, einen Decoder / Dekompressor zu implementieren, wenn Sie aufgrund von Lizenzproblemen mit xdelta auf der Empfängerseite zu vermeiden. Schreiben Sie Ihren eigenen VCDIFF diff-Generator, die kompakten diffs erzeugen ist viel komplizierter (man denkt für bewegte Blöcke als Beispiel der Suche).

VCDIFF die Differentiale auch quellen- sein können, das heißen, sie in die Zieldatei zu dekomprimieren ohne Quelldatei (die Datei auf das ein diff angewandt wird) auf der Hand - in VCDIFF eine Datei komprimiert ist ein Spezialfall ein komprimierte Schaffung Delta zwischen zwei Dateien. Dies ist nützlich, weil Sie das gleiche Format verwenden können, unabhängig, ob das Ziel eine Version der Datei hat.

Ich würde beginnen, indem eine Implementierung von diff versucht ( http://en.wikipedia.org/wiki / Diff )

Vorschlag: Verwenden Sie eine Hash-Funktion & eine Kluft & Conquer Ansatz den Block der Änderung zu verengen (s). Nicht gerade eine Kollision sichere Lösung, aber SHA-2 IMO könnte für Sie arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top