如何计算一个巨大文件的MD5和SHA校验和?

时间:2013-09-28 10:06:16

标签: c++ io md5 checksum sha

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

有人可以帮忙推荐一些高效的C ++库吗?

BTW,

在阅读文件fread( buffer, sizeof(char), BUFFER_SIZE, fin )时,BUFFER_SIZE的大小合理吗?

3 个答案:

答案 0 :(得分:2)

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

在我的系统上,我创建了6个文件,每个文件1GB,用md5sum校验和文件需要2秒钟。 (所有6个文件都是12秒)。

答案 1 :(得分:1)

您可以使用Openssl。 搜索有关MD5大文件的Mysticial答案 How to create a md5 hash of a string in C? 当您查看Openssl SHA文档时,您将看到使用这些函数的MD5和SHA方式是相同的。 SHA Openssl Docs

答案 2 :(得分:0)

在我的脑海中,我不知道任何快速的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通常非常高效,或者您可能会变得复杂并使用两个线程:一个线程从文件中读取块,另一个线程对读取数据进行哈希处理。这里的想法是始终保持进程执行一些有用的操作,即在等待从文件中读取更多数据时可以计算哈希值。