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

2nc8po8w  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(153)

我需要计算一个文件的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实现下面的示例吗?
我希望这篇文章能帮助每一个像我一样搜索它的人。

q3aa0525

q3aa05251#

boost 1.71之后boost/uuid/detail/md5.hpp不能正确计算md5,详情可以参考https://github.com/boostorg/uuid/issues/111,所以boost现在没有md5了.
paste what links sa:
UUID不提供MD5生成的公共组件。您使用的是名称生成器的实现细节,它不必像其他工具那样给予兼容的MD5。

iecba09b

iecba09b2#

请确保使用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, intDigest + (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;
}

字符串

ulydmbyx

ulydmbyx3#

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

相关问题