打印MD5功能的结果

时间:2015-09-03 16:34:42

标签: c++ md5

我想为某些字符串打印MD5。为此我完成了函数

std::string generateHashMD5(std::string text)
{
    unsigned char * resultHash;
    resultHash = MD5((const unsigned char*)text.c_str(), text.size(), NULL);
    std::string result;
    result += (char *) resultHash;
    return result;
}

Mow我想打印这个功能的结果。我尝试版本的这种功能。

void printHash(std::string hash)
{
    for (unsigned i = 0; i < str.size(); i++) 
    {
         int val = (short) hash[i];
         std::cout<<std::hex<<val<<':';
    }
    std::cout<<std::endl;
}



std::string printHash(std::string hash)
{
     char arrayResult[200];
     for(int i = 0; i < 16; i++)
          sprintf(&arrayResult[i*2], "%02x", (unsigned short int)hash[i]);
    std::string result;
    result += arrayResult;
    return result;
}

问题是遗憾的是,没有一个没有显示正确的结果。该功能应该改变什么或错误在哪里?

2 个答案:

答案 0 :(得分:1)

您不正当地使用std::string作为缓冲区:

result += (char *) resultHash;

将resultHash视为一个c字符串,因此如果中间有\ 0字节,则无法获得足够的数据。如果没有\ 0字节,则会复制太多并获得UB。你应该使用大小为的构造函数:

std::string result( static_cast<const char *>( resultHash ), blocksize );

其中块大小可能是16.但我建议使用std::array<uint8_t,blocksize>std::vector<uint8_t>代替os std::string,因为std::string缓冲区非常混乱。

答案 1 :(得分:0)

如果MD5返回字节数组

result += (char *) resultHash; return result;

转换为字符串将在0之后丢失数字,因为字符串构造函数将输入解释为以null结尾的字符串 因此可以使用向量或具有明确字符数的字符串构造。

尽管如此,还没有足够的信息可以准确地说出