为了与外部数据馈送交互,我需要传递一个经过MD5散列的滚动安全密钥(每天我们都需要生成一个新的MD5散列密钥)。
每次调用外部提要时,我都在权衡是否要这样做。我需要有一个大约10个字符的字符串作为提要。
它适用于ASP.NET (C#/ .NET 3.5)站点,几乎每个页面都使用该提要。我最好的做法是每天生成一次散列,然后将其存储在应用程序缓存中,并获得内存命中,还是在每次请求时生成它?
发布于 2009-01-07 06:28:44
优化的唯一可接受的基础是数据。测量生成这个内联,并测量缓存它。
我的高端工作站可以在一秒钟内计算出超过100k的10字节数据段的MD5哈希值。缓存对我来说没有任何好处,我打赌对你也是一样。
发布于 2009-01-07 06:22:27
生成一些样本数据。嗯,有很多。计算样本数据的MD5。测量它所需的时间。你自己决定吧。
发布于 2009-01-07 06:46:29
计算算法的时间复杂度!
请看下面的代码:
public string GetMD5Hash(string input)
{
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
bs = x.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
foreach (byte b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
string password = s.ToString();
return password;
}如果我们要计算时间复杂度,我们会得到T= 11 +n*2,但这只是“我们看到的”,即ToLower可能会做一些我们不知道的繁重工作。但从这一点我们可以看出,该算法在所有情况下都是O(n)。这意味着时间随着数据的增长而增长。
此外,为了解决缓存问题,我更愿意将“繁重”的工作放在内存中,因为与CPU使用量相比,内存的成本更低。
https://stackoverflow.com/questions/419327
复制相似问题