如何使用boost计算文件的md5?

时间:2019-03-08 20:08:24

标签: c++ boost md5

我需要计算文件的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版本实现以下示例吗?

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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`
}