C# 在.NET中,MD5代有多贵?

C# 在.NET中,MD5代有多贵?,c#,.net,asp.net,performance,md5,C#,.net,Asp.net,Performance,Md5,为了与外部数据源交互,我需要传递一个经过MD5哈希处理的滚动安全密钥(每天我们都需要生成一个新的MD5哈希密钥) 每次我们调用外部提要时,我都在权衡是否这样做。我需要有一个大约10个字符的字符串作为提要 它适用于ASP.NET(C#/.NET3.5)网站,几乎每个页面都使用该提要。我最好每天生成一次散列,然后将其存储在应用程序缓存中,然后接受内存命中,还是在每次请求时生成它?生成一些示例数据。嗯,很多。计算样本数据的MD5。测量所需的时间。自己决定。优化的唯一可接受的基础是数据。度量生成此内联并

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

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


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

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

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


我的高端工作站可以在一秒钟内计算10字节数据段的100k MD5哈希值。缓存这个对我来说没有任何好处,我打赌对你来说也是一样。

如果某一天的缓存也是一样的话,这可能是个好主意。您甚至可以将缓存设置为24小时,并编写代码,以便在缓存过期时重新生成哈希

计算算法的时间复杂度

请看以下代码:

   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,但这只是“我们看到的”,即托洛尔可能会做一些我们不知道的繁重工作。但是从这一点我们可以看到,这个算法在所有情况下都是O(n)。这意味着时间随着数据的增长而增长


同样为了解决缓存问题,我宁愿在内存中进行“繁重”的工作,因为与CPU使用量相比,内存更便宜。

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


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

对我来说,这从来都不是什么有趣的事情;执行X需要多少秒?我更愿意看到算法的时间复杂度分析(首先),当然,然后你需要测量每个常数需要多少时间。复杂度分析只有在数据量发生变化时才有意义。我们对这里的数据了解不够-如果数据量是常量(或接近常量),那么Sander的答案就是正确的。您是从相同的10字节计算MD5 100k次,还是生成了10字节的100k段?缓存可能在这里起作用。尽管如此:硬数据-很好拥有。当然,时间会随着数据的增长而增长-但与这个问题最相关的是ComputeHash的成本。此外,字符串操作的成本并不取决于输入的大小-因为ComputeHash总是给出相同大小的哈希,而不管输入大小如何。(对不起,我的意思是ComputeHash之后的字符串操作-对GetBytes的调用当然取决于输入大小。但是(目前)还没有证据表明真正问题的输入数据是文本。)说得好,Jon。但是ComputeHash需要更长的时间来处理更多的数据,这当然是可以理解的。但这是一个“常量”依赖于n的成本。除了计算散列,你无论如何都有n的成本。因此,做md5也可能以n^2结束。这取决于CH的结构。我关于这个答案不增值的观点是,问题是:“计算散列的成本有多高”,在去掉不相关的字符串构建内容后,你的答案是“这取决于ComputeHash方法的成本。”散列了多少数据?是否有一些简单的触发器可以让您注意到数据已更改?您能否将当前散列存储在存储散列数据的同一位置?