如何计算大文件的 MD5 和 SHA 校验和

How to Calculate the MD5 and SHA checksum of a huge file?

本文关键字:MD5 SHA 校验和 文件 何计算 计算      更新时间:2023-10-16

我想计算一系列大文件的MD5和SHA校验和。每个文件都是关于1GB,所以我希望尽可能快。

谁能帮忙推荐一些高效的C++库?

顺便说一句,

读取文件时,fread( buffer, sizeof(char), BUFFER_SIZE, fin )BUFFER_SIZE的大小是合理的?

你可以使用Openssl。搜索关于MD5大文件的神秘答案如何在 C 中创建字符串的 md5 哈希?当您查看 Openssl SHA 文档时,您会发现 MD5 和 SHA 使用这些函数的方式是相同的。SHA Openssl Docs

我个人会做FILE *pipe = popen("md5sum filename");[或类似的事情] - 它可能和其他任何东西一样快,因为 1GB 的文件需要一点时间才能读取,并且计算不太可能占用您的大部分 CPU 时间 - 大部分时间将等待磁盘加载文件。

在我的系统上,我创建了 6 个文件,每个文件为 1GB,使用 md5sum 对文件校验和需要 2 秒。(所有 6 个文件均为 12 秒(。

在我的头顶上,我不知道任何快速C++库。计算哈希相对简单,因此任何 C 库都很容易使用(您可以轻松地自己将其包装在 C++ 类中(。我找到了以下网站,其中一个人在 x86 汇编中实现了几种哈希算法,并将它们与相同算法的"官方"C 实现进行了比较:


https://www.nayuki.io/page/fast-sha1-hash-implementation-in-x86-assemblyhttps://www.nayuki.io/page/fast-md5-hash-implementation-in-x86-assembly

这些实现应该是一个很好的起点,然后你只需要使文件 I/O 尽可能高效。内存映射 I/O 通常非常有效,或者您可以变得复杂并使用两个线程:一个线程从文件中读取块,另一个线程散列读取的数据。这里的想法是始终保持进程做一些有用的事情,即可以在等待从文件中读取更多数据的同时计算哈希。