ファイルの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");