2

可能重复:
在 C# 中散列 SHA1 大文件(超过 2gb)

我有一个大文件,它给了我错误“抛出了'System.OutOfMemoryException'类型的异常。”

任何人都有解决此问题的想法或解决方案。请帮忙。示例代码....

 private string GetSha1()
    {
        string filePath = txtFileName.Text;
        byte[] filebytes = System.IO.File.ReadAllBytes(filePath);
        byte[] hashValue;
        SHA1Managed hashString = new SHA1Managed();

        string hex = "";

        hashValue = hashString.ComputeHash(filebytes);
        foreach (byte x in hashValue)
        {
            hex += String.Format("{0:x2}", x);
        }
        return hex;
    }

我在上面代码的下面一行遇到异常......

   byte[] filebytes = System.IO.File.ReadAllBytes(filePath);

filePath 的文件大小> 500MB。

4

3 回答 3

13

无需将整个文件读入内存,只需将流传递给 ComputeHash

using(var file = File.Open(path,FileMode.Open))
{
   hashValue = hashString.ComputeHash(file);
}
于 2012-08-20T13:36:14.037 回答
2

好吧,您已经解释了问题所在。您正在尝试将 500MB 文件直接读取到 a 中byte[],因为您使用的是ReadAllBytes(). 除了小文件之外,这并不适合任何东西。

如果您想计算文件的哈希值,只需使用流作为参数:

using (filestream f = File.Open(path,FileMode.Open))
{
    hashValue = hashString.ComputeHash(f);
}
于 2012-08-20T13:37:54.947 回答
1

也许您应该一次使用System.IO.File.Read并将文件的一部分读入字节数组,而不是一次读取整个文件。

请参阅MSDN上有关使用Read.

于 2012-08-20T13:37:32.370 回答