0

ディレクトリ A からディレクトリ B にファイルを同期する必要があります。A のファイルをチェックし、B のファイルと 1 つずつ比較します。Aと同じ名前のファイルがBにある場合は、サイズを比較してファイルが異なるかどうかを確認します。ファイル サイズが異なる場合は、これをログに記録して次のファイルに移動します。ただし、ファイル サイズが同じ場合は、ファイルの内容も異なることを確認する必要があります。このために、両方のファイルのハッシュを作成して比較することを考えました。これは良いですか、それともファイルをバイトごとに比較する必要がありますか? また、どちらかの方法を選択する理由も教えてください。

私は C# (.NET 4) を使用しており、A に新しく追加されたファイルをレプリケートし、重複を報告 (およびスキップ) しながら、B のすべてのファイルを保持する必要があります。

ありがとう。

編集:このジョブは夜間に実行され、ファイルのハッシュをディレクトリ B にのみ保存するオプションがあります。ディレクトリ A は動的に入力されるため、これらのファイルを事前にハッシュすることはできません。また、ハッシュの衝突も避けたいので、どのハッシュアルゴリズムがこの目的に適していますか。

4

3 に答える 3

1

ファイルを同期する必要がある場合、比較できるもう 1 つのことがあります。ファイルの日付です。これが異なる場合、ファイルはおそらく変更されています。

また、実際にはほとんどの場合、ハッシュ (md5 または sha1 を使用します。値の範囲が限られているため、crc ではなく、衝突が頻繁に発生するため) で十分です。そして、これらのハッシュが等しい場合は、バイトごとの比較を行う必要があります。確かにこれは追加の手順ですが、必要になることはめったにありません。

実際には B にハッシュを保存する必要があるため、毎回再計算する必要はありませんが、ハッシュを更新せずに B 上のファイルを変更できないことを確認する必要があります。

于 2013-06-07T06:46:55.797 に答える
0

ハッシュ コードのみを使用して 2 つのファイルを比較する場合、ハッシュ コードが異なる場合は、ファイルが異なることを確認できます。

ただし、ハッシュ コードが同じ場合、ファイルが本当に同じかどうかはわかりません。

32 ビットのハッシュ コードを使用する場合、ハッシュ コードが同じであっても、ファイルが異なる可能性は 2^32 分の 1 です。64 ビットのハッシュ コードの場合、確率は当然 2^64 分の 1 です。

すべてのファイルのハッシュ コードを B に格納すると、最初の比較がはるかに高速になりますが、2 つのハッシュ コードが同じ場合にどうするかを決める必要があります。チャンスをつかんで、両方とも同じだと思いますか?それとも、同じハッシュを持つ 2 つのファイルを発見した後で、バイトごとの比較を行いますか?

ファイルのハッシュ コードを計算した後でバイトごとの比較を行うと、ファイルの内容に 2 回アクセスすることになることに注意してください。これにより、かなりの割合のファイルが同じである場合、ハッシュ コードの使用が遅くなる可能性があります。いつものように、どちらが速いかを確認するには、いくつかのタイミングを実行する必要があります。

2 つのファイルが同じであると誤って想定するわずかな可能性を受け入れることができれば、確認の比較を避けることができます... しかし、私は自分でそのチャンスを利用したくありません。

要約すると、私はおそらく毎回比較を行い、ハッシュを気にする必要はありません (ファイル名とサイズの比較で既に行っていることを除いて)。

ファイル名とサイズが一致するほぼすべてのファイルが同じであることがわかった場合、ハッシュを使用すると、ほぼ確実に速度が低下することに注意してください。

于 2013-06-07T06:35:10.727 に答える