The*_*ist 16 c++ linux string hash md5
我有一个很好的内存映射文件示例,用于计算文件的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();
Run Code Online (Sandbox Code Playgroud)
我做的改变是:
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();
Run Code Online (Sandbox Code Playgroud)
但这会产生结果:
8b1a9953c4611296a827abf8c47804d7
Run Code Online (Sandbox Code Playgroud)
虽然命令$ md5sum <<< Hello给出了结果:
09f7e02f1290be211da707a266f153b3
Run Code Online (Sandbox Code Playgroud)
为什么结果不一致?哪一个错了?
谢谢.
编辑:
所以我得到了正确的答案,在那里打勾.md5sum从终端呼叫的正确方法是:
$ printf '%s' "Hello" | md5sum
Run Code Online (Sandbox Code Playgroud)
避免包含新行.
Tob*_*ght 16
您正在向md5sum程序传递最终换行符,但不会传递给您的代码.
您可以看到bash <<<运算符添加了换行符:
$ od -ta <<<Hello
0000000 H e l l o nl
0000006
Run Code Online (Sandbox Code Playgroud)
为避免这种情况,请使用printf:
$ printf '%s' Hello | od -ta
0000000 H e l l o
0000005
$ printf '%s' Hello | md5sum
8b1a9953c4611296a827abf8c47804d7 -
Run Code Online (Sandbox Code Playgroud)
或者,您可以在程序版本中包含换行符:
std::string str("Hello\n");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10235 次 |
| 最近记录: |