C++中用memcmp比较MD5哈希摘要,打印一致但返回异常值的问题
问题根源:参考哈希的类型不匹配
核心错误
你定义的ref_digest是ASCII字符串形式的哈希值,而calculated_digest是MD5算法生成的二进制字节数组,两者底层存储的内容完全不同:
- 字符串里的
'd'实际存储的是ASCII码0x64,而二进制哈希的第一个字节是0xd4(十进制212),本质是两个完全不一样的数值。 - 你看到打印结果一致,是因为打印时把二进制字节转成了十六进制字符串,和参考的字符串形式视觉上相同,但底层数据天差地别,所以
memcmp返回非0值。
修正方法
把参考哈希定义成二进制字节数组,而非字符串。以空字符串的MD5哈希为例,正确的定义方式是:
unsigned char ref_digest[] = {0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e};
此时memcmp比较的是同类型的二进制数据,结果会返回0。
更优的测试比较方法
可以将计算出的二进制哈希转换成十六进制字符串,再和参考字符串直接比较,这种方式可读性更高,调试也更直观:
// 辅助函数:二进制MD5哈希转十六进制字符串 std::string md5_to_string(unsigned char* digest) { std::stringstream ss; ss << std::hex << std::setfill('0'); for(int i = 0; i < MD5_DIGEST_LENGTH; i++) { ss << std::setw(2) << static_cast<int>(digest[i]); } return ss.str(); } // 测试代码 std::string ref_str = "d41d8cd98f00b204e9800998ecf8427e"; std::string calculated_str = md5_to_string(calculated_digest); bool is_equal = (ref_str == calculated_str); std::cout << "Comparison result: " << (is_equal ? "Equal" : "Not Equal") << std::endl;
这种方式和你打印的内容直接对应,不需要手动转换二进制数组,能大幅降低出错概率。
内容的提问来源于stack exchange,提问作者hdcdigi
相关产品推荐
相关产品推荐

