質問

C ++でツールを作成して、ファイル内の変更されたビットを複製用の別のファイルと比較する必要があります。これを達成するための最良の方法は何ですか?

特定のOSやライブラリを念頭に置いていないので、提案を受け付けています。私の主な目標は、複製に関係するネットワークトラフィックの量を減らすことです。

役に立ちましたか?

解決

rsyncを見る-ファイルをブロックに分割し、各ブロックのチェックサムを計算し、チェックサムのみを送信して、必要な場合にのみブロックデータを送信する前に宛先に変更があるかどうかを判断します。

他のヒント

rsyncをそのまま使用できない場合は、 librsync を確認してください。古いですが、コードは読みやすく、改善しやすいです。

同じマシン上に古いバージョンと新しいバージョンのファイルがない場合は、rsyncのようなアルゴリズムが前進します(前の回答を参照)。同じマシン上に古いバージョンと新しいバージョンの両方のファイルがある場合は、rsyncよりも優れた方法を実行できます。圧縮された差分を生成し、ネットワーク経由で送信します。

効率的な差分を生成するには、VCDIFF(RFC 3284)バイナリデルタ圧縮をご覧ください。 1つの適切な実装はxdelta(www.xdelta.org)です。ライセンスの問題のために受信側でxdeltaの使用を避けたい場合、デコーダー/解凍プログラムを実装するのはかなり簡単です。コンパクトなdiffを生成する独自のVCDIFF diffジェネレーターの作成は、はるかに複雑です(例として、移動したブロックの検索を考えてください)。

VCDIFFでは、差分はソースレスにすることもできます。つまり、ソースファイル(差分が適用されるファイル)を手元に置かずにターゲットファイルに解凍します。VCDIFFでは、ファイルの圧縮は、 2つのファイル間のデルタ。これは、宛先にファイルのバージョンがあるかどうかに関係なく、同じ形式を使用できるため便利です。

diffの実装を試すことから始めます( http://en.wikipedia.org/wiki / Diff

提案:ハッシュ関数を使用&格差&変更のブロックを絞り込むアプローチを征服します。厳密には衝突防止ソリューションではありませんが、SHA-2 IMOが動作する可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top