You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:30:48