哈希速度 - 神秘的结果(哈希比哈希慢一倍)

时间:2015-06-15 18:45:16

标签: c# .net hash

我试图理解为什么多个哈希的散列比一个哈希慢 。在下面的测试中,我将文件哈希两次 - 首先使用SHA1,然后使用SHA1和SHA256。第一次执行显示了预期的结果 - 磁盘读取占据了使用的时间 - 两者都花了大约30秒(后者大约一秒钟,尽管工作量更多)。

然而,在随后的执行中,我得到一个奇怪的结果:第一个约为10秒,第二个约为30秒。 10暗示原始磁盘读取花了20秒,而30暗示它几乎没有花费时间。这可能真的意味着,由于某些原因,哈希一次比两次快得多。但为什么呢?

这里发生了什么?

代码:

Text = TestSpeed(new HashAlgorithm[] { new SHA1Managed() }, path);
Text += " " + TestSpeed(new HashAlgorithm[] { new SHA1Managed(), new SHA256Managed() }, path);

public string TestSpeed(HashAlgorithm[] algorithms, string path)
{
    Stopwatch sw = new Stopwatch();
    sw.Start();

    byte[] block = new byte[65536];
    int bytesRead = 0;
    using (FileStream stream = new FileStream(path, FileMode.Open))
        while ((bytesRead = stream.Read(block, 0, block.Length)) > 0)
            foreach (HashAlgorithm algorithm in algorithms)
                algorithm.TransformBlock(block, 0, bytesRead, null, 0);
    foreach (HashAlgorithm algorithm in algorithms)
        algorithm.TransformFinalBlock(block, 0, 0);

    sw.Stop();
    return sw.Elapsed.ToString();
}

1 个答案:

答案 0 :(得分:3)

您的结果很可能是由磁盘缓存引起的。假设两个测试都在相同的数据上运行,只有第一次读取将导致大量的I / O时间。 IE:

  • 迭代1,测试1:30秒(= 20秒磁盘读取,10秒工作)。
  • 迭代1,测试2:30秒(= 0秒读取磁盘,30秒工作)。
  • 迭代2,测试1:10秒(= 0s磁盘读取,10s工作)。
  • 迭代2,测试2:30秒(= 0秒读取磁盘,30秒工作)。
  • ...等。

这意味着散列两次比散列一次大约三倍。由于SHA256的性能通常约为SHA1的一半,因此这似乎是一个明智的结果。

您可以通过在开始测试之前首先将文件读入内存流并在测试期间使用内存流进行所有读取来解耦此效果。分析会向您显示执行时间的花费。