Question

Je dois écrire un outil en C ++ pour déterminer les bits modifiés dans un fichier par rapport à un autre fichier pour la réplication. Quelle serait la meilleure méthode pour y parvenir?

Je n'ai pas de système d'exploitation ni de bibliothèque en tête, je suis ouvert aux suggestions. Mon objectif principal est de réduire la quantité de trafic réseau nécessaire à la réplication.

Était-ce utile?

La solution

Regardez rsync - il divise le fichier en blocs, calcule une somme de contrôle pour chaque bloc et ne transmet que la somme de contrôle pour déterminer s’il existe des changements dans la destination avant de transmettre les données de bloc uniquement si nécessaire.

Autres conseils

Si vous ne pouvez pas utiliser rsync en l’état, consultez librsync . C'est vieux, mais le code est facile à lire et à améliorer.

Si vous ne disposez pas de l'ancienne et de la nouvelle version des fichiers sur le même ordinateur, les algorithmes de type rsync sont la voie à suivre (voir les réponses précédentes). Si vous avez à la fois l'ancienne et la nouvelle version de fichiers sur le même ordinateur, vous pouvez alors faire mieux que rsync: générer des diffs compressés et les envoyer sur le réseau.

Pour générer des différences efficaces, consultez la compression delta binaire VCDIFF (RFC 3284). Xdelta (www.xdelta.org) est une bonne implémentation. Il est relativement facile d'implémenter un décodeur / décompresseur si vous voulez éviter d'utiliser xdelta du côté destinataire en raison de problèmes de licence. Écrire votre propre générateur de diff VCDIFF qui générera des diffs compacts est beaucoup plus compliqué (pensez à la recherche de blocs déplacés, par exemple).

Dans VCDIFF, les diffs peuvent aussi être sans source, c’est-à-dire qu’ils se décompressent dans le fichier cible sans fichier source (le fichier auquel un diff est appliqué) - dans VCDIFF, la compression d’un fichier est un cas particulier de la création d’un fichier compressé. delta entre deux fichiers. Ceci est utile car vous pouvez utiliser le même format, que la destination ait ou non une version de votre fichier.

Je commencerais par essayer quelques implémentations de diff ( http://en.wikipedia.org/wiki / Diff )

suggestion: utilisez une fonction de hachage & amp; une division & amp; vaincre l'approche pour réduire le bloc de changement (s). Ce n’est pas vraiment une solution anti-collision, mais SHA-2 IMO pourrait fonctionner pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top