7

为了与外部数据源交互,我需要传递一个经过 MD5 散列的滚动安全密钥(每天我们都需要生成一个新的 MD5 散列密钥)。

每次我们调用外部提要时,我都会权衡是否这样做。我需要有一个大约 10 个字符的字符串作为提要。

它适用于 ASP.NET (C#/ .NET 3.5) 站点,并且几乎每个页面都使用提要。我最好每天生成一次散列,然后将其存储在应用程序缓存中,并获取内存命中,还是在每次请求时生成它?

4

5 回答 5

14

唯一可接受的优化基础是数据。测量生成此内联并测量缓存它。

我的高端工作站可以在一秒钟内计算出超过 10 万个 10 字节数据段的 MD5 哈希值。缓存这个对我来说是零好处,我敢打赌对你来说也是一样的。

于 2009-01-07T06:28:43.883 回答
3

生成一些样本数据。嗯,很多。计算样本数据的 MD5。测量所需的时间。自己决定。

于 2009-01-07T06:22:26.860 回答
1

计算算法的时间复杂度!

看下面的代码:

   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 使用相比,内存更便宜。

于 2009-01-07T06:46:29.450 回答
0

如果在给定的一天缓存中它是相同的,那可能是一个想法。您甚至可以将缓存设置为 24 小时,并编写代码以在缓存过期时重新生成哈希

于 2009-01-07T06:30:23.880 回答
0

使用 Asp.Net 缓存非常容易,所以我不明白为什么不应该缓存密钥。

将密钥存储在缓存中甚至可以节省一些内存,因为您可以重复使用它,而不是为每个请求创建一个新的。

于 2009-01-07T07:44:13.543 回答