Вычислить 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

Почему результаты не совпадают? Какой из них неверен?

Спасибо.


EDIT:

Итак, я получил правильный ответ, который отмечен там. Правильный способ вызова md5sum из терминала:

$ printf '%s' "Hello" | md5sum

Чтобы избежать включения новой строки.

Ответы

Ответ 1

Вы передаете окончательную новую строку в программу 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");