【问题标题】:Calculate MD5 of a string in C++在 C++ 中计算字符串的 MD5
【发布时间】:2015-09-18 21:43:24
【问题描述】:

我有一个很好的内存映射文件示例,它计算文件的 MD5 哈希值。效果很好,没有问题。

我想改变它来计算一个字符串的 MD5 哈希值。

所以例子是:

(包括#include <openssl/md5.h> 以运行此代码,如果您想运行带有文件的代码,还可以提升内容)

unsigned char result[MD5_DIGEST_LENGTH];
boost::iostreams::mapped_file_source src(path);
MD5((unsigned char*)src.data(), src.size(), result);

std::ostringstream sout;
sout<<std::hex<<std::setfill('0');
for(long long c: result)
{
    sout<<std::setw(2)<<(long long)c;
}
return sout.str();

我所做的改变是:

std::string str("Hello");
unsigned char result[MD5_DIGEST_LENGTH];
MD5((unsigned char*)str.c_str(), str.size(), result);

std::ostringstream sout;
sout<<std::hex<<std::setfill('0');
for(long long c: result)
{
    sout<<std::setw(2)<<(long long)c;
}
return sout.str();

但这会产生结果:

8b1a9953c4611296a827abf8c47804d7

虽然命令$ md5sum &lt;&lt;&lt; Hello 给出了结果:

09f7e02f1290be211da707a266f153b3

为什么结果不一致?哪个错了?

谢谢。


编辑:

所以我得到了正确的答案,并在下面打勾。从终端调用md5sum的正确方法是:

$ printf '%s' "Hello" | md5sum

为了避免包含新行。

【问题讨论】:

  • 文件中有回车吗?
  • @Slava 没有文件。 “Hello”只是一个字符串。你能澄清一下你的意思吗?
  • 8b1a9953c4611296a827abf8c47804d7 对于字符串 Hello 是正确的
  • 抱歉错过了将字符串作为标准输入传递的部分。为什么不打印 src.data() 和 src.size() 并进行比较?
  • 你从哪里得到的包含文件?

标签: c++ linux string hash md5


【解决方案1】:

您将最后一个换行符传递给md5sum 程序,而不是您的代码。

可以看到 bash &lt;&lt;&lt; 运算符添加了换行符:

$ od -ta <<<Hello
0000000   H   e   l   l   o  nl
0000006

为避免这种情况,请使用printf:

$ printf '%s' Hello | od -ta
0000000   H   e   l   l   o
0000005
$ printf '%s' Hello | md5sum
8b1a9953c4611296a827abf8c47804d7  -

或者,您可以在程序版本中包含换行符:

std::string str("Hello\n");

【讨论】:

    猜你喜欢
    • 2011-12-20
    • 2012-07-12
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2011-09-23
    • 2020-08-13
    相关资源
    最近更新 更多