我有一个很好的内存映射文件示例,该文件可计算文件的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 <<< Hello给出结果时:
09f7e02f1290be211da707a266f153b3

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

谢谢。

编辑:

所以我得到了正确的答案,它被打勾在那里。从终端调用md5sum的正确方法是:
$ printf '%s' "Hello" | md5sum

为了避免包括新行。

最佳答案

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

您可以看到bash <<<运算符添加了换行符:

$ 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");

关于c++ - 在C++中计算字符串的MD5,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31166313/

10-11 15:46