【问题标题】:Not possible to hash file over 3GB无法对超过 3GB 的文件进行哈希处理
【发布时间】:2014-04-09 17:00:03
【问题描述】:

我正在尝试获取 200 个文件的哈希值,所有文件的大小都不同(从 100 字节到 10GB)。

我面临的主要问题是,md5 不适用于大于 3GB 的文件,只给我OutOfMemoryException

所以我想做的是散列一个文件,而不是散列另一个文件,而不是另一个(就像private bool GenerateHash(String Path) 很忙,而不是等待,如果不是继续,我也希望能够散列文件大小大于 4GB(我的系统规格是 4930k 和 32GB Ram)。

我已经通过终端在 linux 上完成了它,得到了所有的哈希值,但无法在 Windows 上做同样的事情。

目前正在将我所有的东西从服务器移动到家用电脑,并且不想下载相同的文件或更大的文件(检查哈希和大小)

有什么建议吗?

更新:这里是散列文件的代码(编译为 x32 并运行 x64 Box)

public void HashFile(String FPath)
    {
        using (var md5 = MD5.Create())
        {
            using (var stream = File.OpenRead(FPath))
            {
                String ComputedHash = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", String.Empty).ToLower();

                WriteToFile(FPath + "  " + ComputedHash);
            }
        }
    }

【问题讨论】:

  • 你是如何散列你的文件的?请显示一些代码。如果您正确使用它(即流式传输块),System.Security.Cryptography.MD5 没有理由抛出 OutOfMemoryException
  • 请告诉我们您正在将应用程序编译为 x64 并在 x64 机器上运行。
  • 问题是,我还需要能够在 32 位上运行它((
  • 哈希函数可以用任何东西代替,但是这个“任何东西”应该可以帮助我验证文件是否相同
  • 我成功地使用上面给出的代码在 32 位模式下散列了一个 5GB 的文件,并且在此过程中进程内存使用量保持不变。上面的代码不是您实际使用的代码,或者OutOfMemoryException 没有被抛出您认为的位置。

标签: c# hash md5


【解决方案1】:

您应该使用TransformFinalBlockTransformBlock 这样您就不会将整个内容读入内存。

来源:herehere(很好的例子 here too

【讨论】:

  • 您可以在答案中添加使用示例,以防万一,如果原始参考答案不可用。
  • 重载 OP 正在使用 ComputeHash(Stream) 已经这样做了。
  • @presiuslitesnoflek -- ComputeHash(Stream) 不会将其分成块。它将整个流加载到内存中,然后开始工作。您可以通过使用内存映射文件强制它以您描述的方式工作。
  • 不,它不会将整个流加载到内存中,它会以 4KB 块的形式散列(至少在我使用的 .NET 版本中)。
  • here,我看你是对的。我的立场是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
相关资源
最近更新 更多