多くの大きなファイルの MD5 チェックサムを計算する必要があります。このコードは非常に単純です。
System.IO.FileStream file = new System.IO.FileStream(strFullPath, FileMode.Open);
fsFile.Seek(1000, SeekOrigin.Begin); //skip some chars if need be
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] arrBtMd5 = md5.ComputeHash(fsFile);
次のいずれかを実行したい場合、問題が発生します。
- 同じファイルに対していくつかのハッシュ関数を計算します (md5、sha1、crc32 および-what-not)。
- ファイル全体の MD5 を計算し、いくつかのヘッダー行をスキップして同じファイルの別の MD5 を計算します。
これを1つずつ行うと、同じファイルが複数回読み取られます。ディスク I/O はシステムのボトルネックであるため、私の質問は次のとおりです。
- .NET コンパイラ/フレームワークは、同じファイルを複数回読み取り、操作を最適化することを認識できますか? (ヘッダーなしで2番目のmd5計算を追加したとき、影響はそれほど大きくなかったので、それが何かをすると確信しています)。
- 複数の「消費者」間で同じ FileStream を共有するには、どのような手法を使用できますか? FileStream を使用してファイルを一度だけスキミングし、並列に機能するハッシュ関数で使用するためにデータを分割したいと思います。