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

传入const char*计算MD5结果错误,求问题排查与解决

问题分析与解决

我一眼就发现问题所在啦——你在调用MD5()函数时传递了错误的参数,导致算法计算的根本不是目标字符串的哈希值!

错误根源

你的函数参数input本身就是一个指向字符串的const char*指针,但你却传了(unsigned char*)&input给MD5函数。这相当于把指针变量自己的内存地址传给了算法,而不是指针指向的"hoi"字符串内容。MD5拿到的是指针变量在内存里的字节数据,自然算出来的哈希值完全不对。

你之前的正确示例能运行,其实是个巧合:string1是数组名,数组名本身就代表数组首元素的地址,此时&string1(整个数组的地址)和string1(首元素地址)的数值是相同的,所以MD5函数碰巧拿到了正确的字符串数据。但换成指针参数后,这种写法就彻底失效了。

修正后的代码

只需要把MD5调用里的(unsigned char*)&input改成(unsigned char*)input,同时可以添加空指针判断让函数更健壮:

#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>

void md5_string(const char *input) {
    // 处理空指针情况
    if (input == NULL) {
        printf("Error: Input string is NULL!\n");
        return;
    }

    unsigned char digest[MD5_DIGEST_LENGTH];
    // 直接传递input指向的字符串地址,而非指针本身的地址
    MD5((unsigned char*)input, strlen(input), digest);

    char mdString[33];
    for(int i = 0; i < 16; i++) {
        sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);
    }

    printf("md5 digest: %s\n", mdString);
}

// 测试验证
int main() {
    md5_string("hoi"); // 输出正确值:4216455ceebbc3038bd0550c85b6a3bf
    return 0;
}

额外提醒

你之前正确示例里的(unsigned char*)&string1其实是不规范的写法,虽然数值上碰巧正确,但类型并不匹配(&string1是char(*)[4]类型,而MD5需要unsigned char*)。正确的写法应该和修正后的函数一致,用(unsigned char*)string1。

内容的提问来源于stack exchange,提问作者Niels

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:15:02