【问题标题】:How to Calculate the MD5 and SHA checksum of a huge file?如何计算大文件的 MD5 和 SHA 校验和?
【发布时间】:2016-02-18 01:50:22
【问题描述】:

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

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

顺便说一句,

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

【问题讨论】:

  • 通常读取与分配单元的底层大小和/或操作系统通常使用的缓冲区大小相对应的块将提供最佳性能。通常像 4096 字节是最佳的。
  • 购买一个超快的 SSD 磁盘,并在地址空间中至少有 1GB 的连续内存来映射文件。严重地。在您证明自己受 CPU 或内存总线限制(即您已经正确进行基准测试并发现这些区域需要)之前,任何合理的实现都足够了。以免你忘记你的 Knuth。我敢打赌,您几乎在所有情况下都会受到磁盘 io 的限制,除非您可以通过点击该大小文件上的 spin-spindle-faster 按钮来加快步伐,否则您选择的 lib 可能会差别不大,只要作者不是庸医。

标签: c++ io md5 checksum sha


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-05-18
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 2013-04-29
        相关资源
        最近更新 更多