TransformBlockからの結果をキャッシュして、毎回同じハッシュを再計算することなく、さらにハッシュするために再利用できるようにすることができます。次の小さなサンプルを考えます。
static void Main(string[] args)
{
for (int i = 0; i < 100000; ++i)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] exe = File.ReadAllBytes(@"..\..\..\md5cache\bin\Debug\md5cache.exe");
byte[] wrk = Encoding.UTF8.GetBytes(Path.GetFullPath(@"..\..\..\md5cache\bin\Debug"));
byte[] cmd = Encoding.UTF8.GetBytes(@"test" + i.ToString() + ".bin");
md5.TransformBlock(exe, 0, exe.Length, null, 0);
md5.TransformBlock(wrk, 0, wrk.Length, null, 0);
md5.TransformFinalBlock(cmd, 0, cmd.Length);
byte[] hash = md5.Hash;
string hexHash = BitConverter.ToString(hash);
Console.WriteLine(hexHash.Replace("-", ""));
}
}
exeとwrkのデータは、アプリの存続期間を通じて変更されることはありませんが、パスごとにデータを不必要に再計算することを避けるために、これをキャッシュする方法を見つけることができません。
プロパティを見たことがありますCanReuseTransform
が、これがどのように使用されているかわかりません。ゲッターにすぎないように見えるので、スタックできるかどうかを確認するために使用されていると思います。TransformBlock/TransformFinalBlock.
それで、これが可能かどうか誰かが知っていますか?必要なすべてのビットが使用可能であると仮定して、新しいクローン可能なMD5CryptoServiceProviderクラスを作成できると思います。