如何使用boost::hash获取文件内容的哈希值?

3

可以使用boost:hash函数生成类似MD5的固定长度的文件内容哈希吗?

如果有,是否有快速解决方案?

如果没有,最简单的方法是什么?

2个回答

6
不,Boost不实现MD5。使用加密/哈希库来进行此操作较好。在我的经验中,CryptoC++很不错。OpenSSL实现了所有流行的消息摘要算法,以下是一个使用OpenSSL的示例:在线演示
#include <openssl/md5.h>
#include <iostream>
#include <iomanip>

// Print the MD5 sum as hex-digits.
void print_md5_sum(unsigned char* md) {
    for(unsigned i=0; i <MD5_DIGEST_LENGTH; i++) {
        std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(md[i]);
    }
}

#include <string>
#include <vector>
#include <fstream>

int main(int argc, char *argv[]) {
    using namespace std;
    vector<string> const args(argv+1, argv+argc);

    for (auto& fname : args) {

        MD5_CTX ctx;
        MD5_Init(&ctx);

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

        char file_buffer[4096];
        while (ifs.read(file_buffer, sizeof(file_buffer)) || ifs.gcount()) {
            MD5_Update(&ctx, file_buffer, ifs.gcount());
        }
        unsigned char digest[MD5_DIGEST_LENGTH] = {};
        MD5_Final(digest, &ctx);

        print_md5_sum(digest);
        std::cout << "\t" << fname << "\n";
    }
}

这只适用于Linux,这对我来说是个问题。 - Croll
1
@joker,无论是加密的C++还是OpenSsl都可以在Windows上使用(以及你能想到的大多数平台)。 - sehe
你的代码(以及任何其他示例)使用Linux头文件,如果有的话,能否展示Windows示例?这将非常棒。 - Croll
@Joker。实际上,这些头文件主要涉及读取文件。你可能可以用其他方式处理它?这里有一个***非常C++化的版本***。你可以在这个直播录像中看到我重构的过程。 - sehe
1
我目前没有访问Windows开发机的权限。但是,你可以在这里观看我配置VS2013针对OpenSSL进行编译的过程:直播录像¹,当回答这个旧问题时。我恰好完成了下载OpenSSL、创建导入库、配置包含和库目录等整个过程。因此,如果你遇到困难,并且有耐心,你可以观看那个¹(实验)。 - sehe
让我们在聊天中继续这个讨论 - sehe

2

boot有这样的功能。至少现在有: https://www.boost.org/doc/libs/master/libs/uuid/doc/uuid.html

最初的回答
#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;
}

最初的回答
这是一个实时示例,可以在此处查看。

需要注意的是:https://dev59.com/trLma4cB1Zd3GeqPaGSL#68924521 - malat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接