複数のマシン間で大きなファイルを同期する必要があります。ファイルのサイズは最大 6 GB になります。同期は数週間ごとに手動で行います。ファイル名はいつでも変更される可能性があるため、考慮に入れることはできません。
私の計画は、宛先 PC とソース PC にチェックサムを作成し、宛先にまだ存在しないチェックサム付きのすべてのファイルを宛先にコピーすることです。私の最初の試みは次のようになります。
using System.IO;
using System.Security.Cryptography;
private static string GetChecksum(string file)
{
using (FileStream stream = File.OpenRead(file))
{
SHA256Managed sha = new SHA256Managed();
byte[] checksum = sha.ComputeHash(stream);
return BitConverter.ToString(checksum).Replace("-", String.Empty);
}
}
問題は実行時間でした:
- 1.6 GB のファイルで SHA256 を使用する場合 -> 20 分
- 1.6 GB のファイルで MD5 を使用する場合 -> 6.15 分
チェックサムを取得するよりよい、より速い方法(おそらくよりよいハッシュ関数を使用)はありますか?
ベストアンサー1
ここでの問題は、SHA256Managed
一度に 4096 バイトを読み取ることです (ファイルストリームからどれだけ読み取るかを確認するには、FileStream
継承してオーバーライドします)。これは、ディスク IO のバッファーとしては小さすぎます。Read(byte[], int, int)
処理を高速化するには (私のマシンでは SHA256 を使用して 2 GB のファイルをハッシュするのに 2 分、MD5 の場合は 1 分)、次のようにラップしてFileStream
適切BufferedStream
なサイズのバッファー サイズを設定します (私は ~1 Mb のバッファーで試しました)。
// Not sure if BufferedStream should be wrapped in using block
using(var stream = new BufferedStream(File.OpenRead(filePath), 1200000))
{
// The rest remains the same
}