C++计算字符串的MD5
Calculate MD5 of a string in C++
我有一个很好的内存映射文件示例,它计算文件的 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");
我有一个很好的内存映射文件示例,它计算文件的 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");