【问题标题】:how to calculate md5 of a file using boost?如何使用boost计算文件的md5?
【发布时间】:2019-07-30 21:44:00
【问题描述】:

我需要计算文件的 md5,但出于某种原因我不想将我的项目与 OpenSSL 库链接。 对我来说,最好的解决方案之一是通过 boost 库实现。 我找到了下一个样本:

#include <boost/md5.hpp>
#include <iostream>
#include <fstream>

std::cout << boost::md5("message").hex_str_value();

boost::md5(std::ifstream("file.txt")).hex_str_value();

但不幸的是,当前的 boost 版本 (1.68.0/1.69.0) 中没有 boost/md5.hpp 标头。

谁能告诉我如何使用当前的 boost 版本 1.69.0 实现下面的示例?

我希望这篇文章能帮助所有像我一样搜索它的人。

【问题讨论】:

标签: c++ boost md5


【解决方案1】:

boost 有这样的功能:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <boost/uuid/detail/md5.hpp>
#include <boost/algorithm/hex.hpp>

using boost::uuids::detail::md5;

std::string toString(const md5::digest_type &digest)
{
    const auto charDigest = reinterpret_cast<const char *>(&digest);
    std::string result;
    boost::algorithm::hex(charDigest, charDigest + sizeof(md5::digest_type), std::back_inserter(result));
    return result;
}

int main ()
{
    std::string s;

    while(std::getline(std::cin, s)) {
        md5 hash;
        md5::digest_type digest;

        hash.process_bytes(s.data(), s.size());
        hash.get_digest(digest);

        std::cout << "md5(" << s << ") = " << toString(digest) << '\n';
    }

    return 0;
}

Live Example

【讨论】:

  • 使用“细节”中的东西不是很好,是吗?
【解决方案2】:

确保使用 boost 1.66.0 或更高版本来使用此功能。 对 Marek R 代码中的 ToString() 方法进行小的更改,因为它会生成无效的校验和。

#include <iostream>
#include <algorithm>
#include <iterator>
#include <boost/uuid/detail/md5.hpp>
#include <boost/algorithm/hex.hpp>

using boost::uuids::detail::md5;

std::string toString(const md5::digest_type &digest)
{
    const auto intDigest = reinterpret_cast<const int*>(&digest);
    std::string result;
    boost::algorithm::hex(intDigest, charDigest + (sizeof(md5::digest_type)/sizeof(int)), std::back_inserter(result));
    return result;
}

int main ()
{
    std::string s;

    while(std::getline(std::cin, s)) {
        md5 hash;
        md5::digest_type digest;

        hash.process_bytes(s.data(), s.size());
        hash.get_digest(digest);

        std::cout << "md5(" << s << ") = " << toString(digest) << '\n';
    }

    return 0;`enter code here`
}

【讨论】:

  • "charDigest" 在你的代码中应该是 "intDigest"。
【解决方案3】:

boost 1.71 boost/uuid/detail/md5.hpp 后无法正确计算md5, 详情可以参考https://github.com/boostorg/uuid/issues/111 ,所以 boost 现在没有 md5。

粘贴什么链接sa:

Boost.UUID 不提供用于 MD5 生成的公共组件。您使用的是名称生成器的实现细节,它不必像其他工具那样提供兼容的 MD5。

【讨论】:

  • 阅读链接可以明确问题,但如果它们不完全依赖于外部链接,那么关于 SO 的答案通常会更有帮助。您可以在此处添加来自链接问题的信息以澄清吗?
猜你喜欢
  • 2010-10-20
  • 2016-12-30
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 2021-10-11
  • 2013-09-08
  • 2012-05-18
  • 2015-12-18
相关资源
最近更新 更多