web-dev-qa-db-ja.com

C ++で文字列の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();

私が行った変更は次のとおりです。

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

改行が含まれないようにするため。

16

最後の改行を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");
16
Toby Speight