我可以从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类,假设我需要的所有位都可用。