2010-12-14 7 views
2

私はこのコードhttp://support.microsoft.com/kb/320348に遭遇し、2つのファイルを比較してそれらが異なるかどうかを調べる最良の方法が何か不思議に思っていました。ファイルをバイトごとに比較するか、すべてのバイトを読み取るか?

主な考え方は、変更されたファイルや削除/作成するファイルのリストを作成するためにファイルが等しいかどうかを確認する必要があるプログラムを最適化することです。

現在、私はファイルのサイズを比較しています。一致すると、2つのファイルのmd5チェックサムに入りますが、この質問の先頭にリンクされているコードを見て、それは2つのファイルのチェックサムを作成する上でそれを使用する(これは基本的にすべてのバイトを取得した後です)?

また、各ファイルをチェックする際の作業を減らすために、他にどのような検証を行う必要がありますか?

+0

私はこれがあなたが何を意味するかに大きく依存すると思います。ファイル内のテキストの等価性や実際のバイト数をテストしますか?ファイルの内容は何ですか?スペースは重要です(テキストの平等)? MD5チェックサムは、行の最後に2つの空白と1つの空白の間の差分があります。単純なテキスト比較ではそうではありません。 – linuxuser27

+0

MD5では、両方のファイルを完全に読み取ってからハッシュを実行する必要があり、大きなファイルの場合は時間がかかることがあります。 – Aliostad

+0

だから私はその質問について疑問に思っていた。AliostadとAnonは私が知りたいと思った点を作った。 – Prix

答えて

4

を読み取るために最適化した後、を比較ために最適化されたメモリ(バイトごと)にバッファを比較さ小さなバッファ(4Kまたは8K)に両方のファイルを読みます。

これは、すべてのケース(差異が開始、中間、または終了にある場合)に最適なパフォーマンスを提供します。

もちろんの最初のステップは、ファイルの長さ異なっているかどうかを確認することであり、そのような場合、ファイルが実際に異なっている。..

+0

+1まず、チェックサムに入る前にファイルのサイズを確認しています。しかし、今私はそれをチェックサムから小さなバッファを持つストリームに変更することが確実になります。いずれにせよ、私は両方のファイルが正しいかどうかを検出します。私は、バイナリ、テキストまたはファイルをw/e ... – Prix

0

あなたはすでにあなたにも、その後、ファイルのハッシュを可能性が計算されていない場合適切な比較を行います(ハッシュを見るのではなく)。ファイルが同じ場合は同じ作業量ですが、異なる場合はずっと早く停止することができます。

もちろん、一度に1バイトを比較するのはおそらく少し無駄でしょう。ブロック全体を一度に読み込んで比較することをお勧めします。

関連する問題