複製のためにファイル内の変更されたビットを別のファイルと比較して判断するツールを C++ で作成する必要があります。これを達成するための最良の方法は何ですか?
特定の OS やライブラリを念頭に置いているわけではありません。提案は受け付けています。私の主な目標は、複製に関係するネットワーク トラフィックの量を減らすことです。
複製のためにファイル内の変更されたビットを別のファイルと比較して判断するツールを C++ で作成する必要があります。これを達成するための最良の方法は何ですか?
特定の OS やライブラリを念頭に置いているわけではありません。提案は受け付けています。私の主な目標は、複製に関係するネットワーク トラフィックの量を減らすことです。
rsync を見てください。ファイルをブロックに分割し、各ブロックのチェックサムを計算し、必要な場合にのみブロック データを送信する前に、宛先に変更があるかどうかを判断するためにチェックサムのみを送信します。
rsync をそのまま使用できない場合は、librsyncを確認してください。古いですが、コードが読みやすく改善されています。
古いバージョンと新しいバージョンのファイルが同じマシンにない場合は、rsync のようなアルゴリズムが有効です (以前の回答を参照)。同じマシンにファイルの古いバージョンと新しいバージョンの両方がある場合は、rsync よりも優れた方法で実行できます。圧縮された差分を生成し、ネットワーク経由で送信します。
効率的な差分を生成するには、VCDIFF (RFC 3284) バイナリ デルタ圧縮を参照してください。良い実装の 1 つは xdelta (www.xdelta.org) です。ライセンスの問題のために受信側で xdelta を使用したくない場合は、デコーダー/デコンプレッサーを実装するのはかなり簡単です。コンパクトな diff を生成する独自の VCDIFF diff ジェネレーターを作成するのは、はるかに複雑です (移動したブロックの検索を例として考えてください)。
VCDIFF では、差分はソースレスにすることもできます。つまり、手元にソース ファイル (差分が適用されるファイル) がなくてもターゲット ファイルに解凍されます。ファイル。これは、宛先にファイルのバージョンがあるかどうかに関係なく、同じ形式を使用できるため便利です。
diff の実装を試すことから始めます ( http://en.wikipedia.org/wiki/Diff )
提案: ハッシュ関数と分割統治法を使用して、変更のブロックを絞り込みます。正確には衝突防止ソリューションではありませんが、SHA-2 IMO がうまくいく可能性があります。