【问题标题】:How expensive is MD5 generation in .NET?.NET 中的 MD5 生成有多贵?
【发布时间】:2010-09-29 23:29:36
【问题描述】:

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

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

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

【问题讨论】:

  • 有多少数据被散列?是否有一些简单的触发器可以注意到数据已更改?您能否将当前哈希存储在您存储 获取 散列的数据的同一位置?

标签: c# .net asp.net performance md5


【解决方案1】:

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

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

【讨论】:

  • 对我来说,这从来都不是很有趣; X 执行需要多少秒?我当然希望看到算法的时间复杂度分析(首先)然后你需要测量每个常数需要多少时间。
  • 复杂性分析只有在数据量发生变化时才有意义。我们对这里的数据了解不够 - 如果它是一个恒定(或接近恒定)的数量,那么 Sander 的答案正是要走的路。
  • 您是从相同的 10 字节计算 MD5 100k 次,还是生成了 100k 的 10 字节段?缓存可能在这里发挥作用。仍然:硬数据 - 很高兴拥有。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    计算算法的时间复杂度!

    看下面的代码:

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

    【讨论】:

    • 当然,时间会随着数据的增长而增长——但与这个问题最相关的是 ComputeHash 的成本。
    • 此外,字符串操作的成本不取决于输入的大小 - 因为无论输入大小如何,ComputeHash 总是给出相同大小的哈希。
    • (对不起,我的意思是字符串操作 after ComputeHash - 对 GetBytes 的调用当然取决于输入大小。目前还没有证据表明输入数据到真正的问题是文本。)
    • 好点乔恩。但是 ComputeHash 需要更长的时间来处理更多的数据,这当然是可以理解的。但这是一个取决于 n 的“恒定”成本。除了 ComputeHash 之外,你的成本还是 n。所以,做 md5 也可能以 n^2 结束。取决于 CH 的结构。
    • 我关于这个答案没有增加价值的观点是,问题是:“计算散列有多贵”,而在无关的字符串构建内容被剥离后,您的答案是“这取决于ComputeHash 方法有多昂贵。”
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        • 2011-09-13
        • 2010-12-05
        • 1970-01-01
        相关资源
        最近更新 更多