私が現在取り組んでいるC#プロジェクトでは、ネットワーク上の大量のファイルのMD5を計算しようとしています(現在のポットは270万、クライアントポットは1000万を超える)。私たちが処理しているファイルの数が増えれば、スピードが問題になります。C#ネットワーク上の高速MD5/SHAハッシュ
これを行う理由は、ファイルを変更せずに別の場所にコピーしたことを確認するためです。
我々は現在、ファイルが
MD5 md5 = new MD5CryptoServiceProvider();
StringBuilder sb = new StringBuilder();
byte[] hashMD5 = null;
try
{
// Open stream to file to get MD5 hash for, create hash
using (FileStream fsMD5 = new FileStream(sFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
hashMD5 = md5.ComputeHash(fsMD5);
}
catch (Exception ex)
{
clsLogging.logError(clsLogging.ErrorLevel.ERROR, ex);
}
string md5sum = "";
if (hashMD5 != null)
{
// Change hash into readable text
foreach (byte hex in hashMD5)
sb.Append(hex.ToString("x2"));
md5sum = sb.ToString();
}
のMD5を計算するには、次のコードを使用し、この速度は、私のマネージャーが望んされたものではありません。私たちは、MD5を計算するファイルの方法と数にいくつかの変更を加えました(つまり、私たちがコピーしていないファイルに対しては行いません。 ALLファイルは、クライアントが、私はネットワークの速度がおそらく主要であることを認識
私は推測するので、すべてのファイルがコピーされ、私たちのプログラム)で時間を浪費することを希望するいくつかの将来の時点でのケースでそれらのために計算MD5を、持っている必要があります寄与因子(100Mbit/s)です。ネットワークを介してファイルの内容のMD5を計算する効率的な方法はありますか?
ありがとうございます。 Trevor Watson
編集:すべてのコードをその一部の代わりにブロックに入れます。
ファイルがコピーされたマシン上でハッシュをローカルで確認できない理由はありますか? – arootbeer
最初のビジネスポイントは、ボトルネックを把握することです。任意のベンチマークを実行して、ハッシュを計算せずにプロセスがファイルを読み込んで反復処理するのにかかる速さを確認しましたか?その後、ハッシュで;どのくらいのオーバーヘッドが計算を取っていますか?ローカルで同じタスクを実行しましたか? –
私はAaronに同意します:ハッシュを計算するのに必要な時間は、ネットワーク上でリモートファイルを開き、ドライブの先頭に移動し、ドライブから読み込み、ネットワーク上でコンテンツをストリーミングし、ハッシュを計算します。いずれの場合でもボトルネックが発生する可能性があります。 Andrew Cooperが示唆したように、これらのファイルのいくつかを別々のファイルに対して並行して実行することができます。 – wigy