C# 为什么在我的C代码中MD5比SHA256慢?

C# 为什么在我的C代码中MD5比SHA256慢?,c#,.net,hash,md5,sha256,C#,.net,Hash,Md5,Sha256,代码如下: static byte[] hashWithMd5(string text) { using (var hasher = MD5.Create()) { byte[] inputBytes = Encoding.ASCII.GetBytes(text); byte[] hash = hasher.ComputeHash(inputBytes); return hash; } } SHA256的代码相同,只是调用了SHA25

代码如下:

static byte[] hashWithMd5(string text)
{
   using (var hasher = MD5.Create())
   {
       byte[] inputBytes = Encoding.ASCII.GetBytes(text);
       byte[] hash = hasher.ComputeHash(inputBytes);
       return hash;
   }
}
SHA256的代码相同,只是调用了SHA256Managed.Create()

每次运行一百万次以散列相同的硬编码20个字符的字符串。使用DateTime.UtcNow测量时间<代码>发布是目标,代码在调试器外部运行。目标框架版本为4.5.2

结果是:

x64
MD5 - 5.89 seconds
SHA256Managed - 2.97 seconds

x86
MD5 - 6.68 seconds
SHA256Managed - 3.57 seconds
因此,无论运行什么配置,SHA256都比MD5快得多


这怎么可能现实地发生呢?SHA256不是计算量更大吗?

这可能是多种原因造成的。虽然md5通常比sha2快,但您可以检查这一点:

因此,这取决于各种因素:

  • 硬件加速,基于您的机器。如果sha256使用GPU,您将看到更快的结果
  • 实施细节(如评论中所述)。在unix上,md5通常比预期的更快

  • 在这里查看本文:您的结果似乎证实了前面提到的
    Θ(n)
    ,但没有稍高的结果。

    似乎只是一个糟糕的实现x86将比x64运行得慢。微处理器的流水线将以比x64更快的速度运行x64。现在请使用百万字节字符串进行尝试。
    DateTime.UtcNow
    不是最好的测量工具,Benchmark.NET甚至
    Stopwatch
    会更好