【问题标题】:SHA checksum for +2GB file using FileStream使用 FileStream 的 +2GB 文件的 SHA 校验和
【发布时间】:2018-04-26 06:14:58
【问题描述】:

为什么在我发现的这个解决方案中没有循环使用缓冲区几次?

using System.IO;
using System.Security.Cryptography;

private static string GetChecksum(string file)
{
    using (FileStream stream = File.OpenRead(file))
    {
        SHA256Managed sha = new SHA256Managed();
        byte[] checksum = sha.ComputeHash(stream);
        return BitConverter.ToString(checksum).Replace("-", String.Empty);
    }
}

我正在尝试为 +2GB 文件生成 SHA 校验和。应该怎么样?

【问题讨论】:

  • @Sinatr 示例代码在这里,来自那里:)
  • @AramKocharyan,问题(在我看来)也是。如果我错了,我希望 OP 澄清一下。
  • ComputeHash() 自己吞下整个流。方便的。该缓冲区是still there

标签: c# .net sha


【解决方案1】:

为什么在我发现的这个解决方案中没有循环使用缓冲区几次?

因为ComputeHash 负责读取整个流并计算哈希值。

【讨论】:

    【解决方案2】:

    您正在使用HashAlgorithm.ComputeHash(Stream) 覆盖。

    循环在引擎盖下。

    这里是ComputeHash方法的简化源代码:

    public byte[] ComputeHash(Stream inputStream) 
    {
        ...
        // Default the buffer size to 4K.
        byte[] buffer = new byte[4096]; 
        int bytesRead;
        do { 
            bytesRead = inputStream.Read(buffer, 0, 4096); 
            if (bytesRead > 0) {
                HashCore(buffer, 0, bytesRead);  // Actual hashing
            }
        } while (bytesRead > 0);
        ...
    }
    

    如您所见,ComputeHash 实际上是按 4096 字节 块进行散列。

    【讨论】:

    • 而且在大文件上速度非常慢。因此,不幸的是,每个关心性能的人都必须使用更大的缓冲区重新实现分块逻辑。
    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多