我想计算一系列大文件的 MD5 和 SHA 校验和。每个文件大约是1GB
,所以我希望尽可能快。
任何人都可以帮助推荐一些高效的 C++ 库吗?
顺便提一句,
读取文件时fread( buffer, sizeof(char), BUFFER_SIZE, fin )
,什么大小BUFFER_SIZE
是合理的?
您可以使用 Openssl。搜索有关 MD5 大文件的神秘答案 如何在 C 中创建字符串的 md5 哈希? 当您查看 Openssl SHA 文档时,您会发现 MD5 和 SHA 使用这些函数的方式是相同的。 SHA Openssl 文档
我个人会做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-assembly
https://www.nayuki.io/page/fast-md5-hash-implementation-in-x86-assembly
这些实现应该是一个很好的起点,然后您只需使文件 I/O 尽可能高效。内存映射 I/O 通常非常高效,或者您可以变得复杂并使用两个线程:一个线程从文件中读取块,另一个线程对读取的数据进行哈希处理。这里的想法是始终让进程做一些有用的事情,即可以在等待从文件中读取更多数据的同时计算哈希值。