Domanda

Devo scrivere uno strumento in C ++ per determinare i bit modificati in un file rispetto a un altro file per la replica. Quale sarebbe il metodo migliore per raggiungere questo obiettivo?

Non ho in mente un sistema operativo o una libreria specifici, sono aperto ai suggerimenti. Il mio obiettivo principale è ridurre la quantità di traffico di rete coinvolto nella replica.

È stato utile?

Soluzione

Guarda rsync: divide il file in blocchi, calcola un checksum per ciascun blocco e trasmette solo il checksum per determinare se ci sono cambiamenti nella destinazione prima di trasmettere i dati del blocco solo se necessario.

Altri suggerimenti

Se non puoi usare rsync così com'è, controlla librsync . È vecchio, ma il codice è facile da leggere e migliorare.

Se non hai le vecchie e nuove versioni di file sulla stessa macchina, allora gli algoritmi simili a rsync sono la strada da percorrere (vedi le risposte precedenti). Se hai la versione vecchia e quella nuova dei file sullo stesso computer, puoi fare di meglio di rsync: generare differenze compresse e inviarle sulla rete.

Per generare differenze efficienti, dai un'occhiata alla compressione delta binaria VCDIFF (RFC 3284). Una buona implementazione è xdelta (www.xdelta.org). È abbastanza facile implementare un decodificatore / decompressore se si desidera evitare di utilizzare xdelta sul lato ricevente a causa di problemi di licenza. Scrivere il proprio generatore di diff VCDIFF che genererà diff compatti è molto più complicato (si pensi alla ricerca di blocchi spostati come esempio).

In VCDIFF i diff possono anche essere sourceless, il che significa che si decomprimono nel file di destinazione senza alcun file di origine (il file a cui viene applicato un diff) a portata di mano - in VCDIFF la compressione di un file è un caso speciale di creazione di un compresso delta tra due file. Questo è utile perché puoi utilizzare lo stesso formato indipendentemente dal fatto che la destinazione abbia una versione del tuo file.

Vorrei iniziare provando a implementare diff ( http://en.wikipedia.org/wiki / Diff )

suggerimento: usa una funzione hash & amp; un divide & amp; conquistare l'approccio per restringere il blocco di cambiamento (s). Non esattamente una soluzione a prova di collisione, ma SHA-2 IMO potrebbe funzionare per te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top