Как вернуть хэш md5 в строку в этом коде C ++? - PullRequest
5 голосов
/ 24 ноября 2011

У меня есть этот код, который показывает мне правильно, md5 строки. Я предпочитаю возвращать строку в функцию, но у меня есть некоторые проблемы с преобразованием значений md5 в мою строку. Это код:

string calculatemd5(string msg)
{
string result;
const char* test = msg.c_str();
int i;

MD5_CTX md5;

MD5_Init (&md5);
MD5_Update (&md5, (const unsigned char *) test, msg.length());
unsigned char buffer_md5[16];
MD5_Final ( buffer_md5, &md5);
printf("Input: %s", test);
printf("\nMD5: ");
for (i=0;i<16;i++){
    printf ("%02x", buffer_md5[i]);
    result[i]=buffer_md5[i];
}
std::cout <<"\nResult:"<< result[i]<<endl;
return result;
}

Например, result[i] - странный символ ascii, подобный этому: . Как можно решить эту проблему?

Ответы [ 4 ]

9 голосов
/ 24 ноября 2011

Более чистый способ (и быстрее) может быть таким:

std::string result;
result.reserve(32);  // C++11 only, otherwise ignore

for (std::size_t i = 0; i != 16; ++i)
{
  result += "0123456789ABCDEF"[hash[i] / 16];
  result += "0123456789ABCDEF"[hash[i] % 16];
}

return result;
6 голосов
/ 24 ноября 2011

заменить

for (i=0;i<16;i++){
    printf ("%02x", buffer_md5[i]);
    result[i]=buffer_md5[i];
}

с

char buf[32];
for (i=0;i<16;i++){
    sprintf(buf, "%02x", buffer_md5[i]);
    result.append( buf );
}

обратите внимание, что при выводе результата выведите result, а не result[i], чтобы получить всю строку.

если вы положите значение buffer_md5[i] непосредственно в результат, то у вас могут возникнуть проблемы, поскольку строка может не иметь встроенного 0 (если оно есть).

1 голос
/ 24 ноября 2011

Кажется, что вы используете openssl.

Используйте константу MD5_DIGEST_LENGTH.

Вы также можете использовать функцию MD5 вместо MD5_Init, MD5_Update и MD5_Final.

MD5() может занять большую часть времени, но если вы хотите уменьшитьвремя sprintf, затем выполните шестнадцатеричную строку вручную.

Подобным образом:

    {
        static const char hexDigits[16] = "0123456789ABCDEF";
        unsigned char digest[MD5_DIGEST_LENGTH];
        char digest_str[2*MD5_DIGEST_LENGTH+1];
        int i;

        // Count digest
        MD5( (const unsigned char*)msg.c_str(), msg.length(), digest );

        // Convert the hash into a hex string form
        for( i = 0; i < MD5_DIGEST_LENGTH; i++ )
        {
            digest_str[i*2]   = hexDigits[(digest[i] >> 4) & 0xF];
            digest_str[i*2+1] = hexDigits[digest[i] & 0xF];
        }
        digest_str[MD5_DIGEST_LENGTH*2] = '\0';

        std::cout <<"\nResult:"<< digest_str <<endl;
    }   

не проверено, поэтому могут быть ошибки.

0 голосов
/ 24 ноября 2011

#include <sstream>

...

std::stringstream ss;

for (i=0;i<16;i++){
    printf ("%02x", buffer_md5[i]);
    ss << std::hex << buffer_md5[i];
}

result = ss.str();

std::hex может не выполнять то, что вы хотите.Возможно, так будет лучше:

for (i=0;i<16;i++){
        printf ("%02x", buffer_md5[i]);
        if (buffer_md5[i] < 10)
            ss << buffer_md5[i];
        else
            ss << 97 + buffer_md5[i] - 15;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...