在C ++中计算一个string的MD5

我有一个很好的内存映射文件的例子,计算文件的MD5哈希值。 这工作正常,没有问题。

我想改变它来计算一个string的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 

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

谢谢。


编辑:

所以我得到了正确的答案。 从terminal调用md5sum的正确方法是:

 $ printf '%s' "Hello" | md5sum 

为了避免包含新行。

Solutions Collecting From Web of "在C ++中计算一个string的MD5"

您正在将最终换行传递给md5sum程序,但不传递给您的代码。

你可以看到bash <<<操作符添加一个换行符:

 $ od -ta <<<Hello 0000000 H ello nl 0000006 

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

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

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

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