【问题标题】:runtime comparison of boost SHA1 hashing with md5sum/sha1sumboost SHA1 哈希与 md5sum/sha1sum 的运行时比较
【发布时间】:2018-09-20 12:06:37
【问题描述】:

我使用 Boost 计算 SHA1 哈希,然后将朗姆酒时间与 Linux 命令 md5sumsha1sum 进行比较。文件大小为28G。 md5sumsha1sum 都是 8.4 版。

这就是我使用 Boost 计算 SHA1 的方式:

void Sha1_Key(const std::string& inputfilename_, uint32_t* inputfile_sha1)
{
    std::string sha1_key_string;
    uint32_t local_sha1[5];

    for (uint32_t i = 0; i < 5; ++i)
    {
        inputfile_sha1[i] = local_sha1[i] = 0;
    }

    std::ifstream ifs(inputfilename_,std::ios::binary);

    boost::uuids::detail::sha1 sha1;
    std::stringstream sha1_key;
    char buf[128*1024];

    clock_t begin = clock();
    while(ifs.good()) {
      ifs.read(buf,sizeof(buf));
      sha1.process_bytes(buf,ifs.gcount());
    }

    ifs.close();
    sha1.get_digest(local_sha1);
    for(std::size_t i=0; i<sizeof(local_sha1)/sizeof(local_sha1[0]); ++i) {
      sha1_key<<std::hex<<local_sha1[i];
      inputfile_sha1[i] = local_sha1[i];
    }
    sha1_key_string = sha1_key.str();
    clock_t end = clock();
    std::cout << "run time for Boost SHA1: " << double(end - begin)/CLOCKS_PER_SEC << " sec"; 
}

这是运行时间比较:

  • 提升 SHA1:170 秒

  • md5sum: 54.719s

  • sha1sum: 81.795s

sha1sum 的复杂度比md5sum 高,所以sha1sum 多花50% 的时间。但是 Boost SHA1 方法的运行时间是 Linux sha1sum 的两倍。为什么?

有什么可以改进我的代码的吗?或者对使用其他哈希方法有什么建议?

【问题讨论】:

  • 您是否在打开优化的情况下进行编译?
  • 重叠 I/O 和计算。在同一个线程中交替执行不是很有效。
  • @Ext3h 这是用于计算 SHA1 的函数,因此它应该包括所有重叠和开销。否则我只需要在我的代码中调用 md5sum。
  • 也许 sha1sum 只是包含比 Boost 更优化的 SHA1 实现。
  • +1 让read 循环正确,gcount (我认为:))

标签: c++ boost hash sha1


【解决方案1】:
boost::uuids::detail::sha1 sha1;

看到了吗? ::detail::

那里告诉您您正在滥用未记录的实现细节,这不是供您使用的。

该 SHA 实现支持 UUID 生成,并且不是为快速消化大型顺序流而设计的。

就是这样。

使用正确的 sha1 实现(libcrypto、cryptoc++ 等)

【讨论】:

  • 您的建议有效。我试过用openssl,运行时间比Linux sha1sum减少了50%。
猜你喜欢
  • 2018-11-26
  • 2012-08-14
  • 2011-03-27
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多