传入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
相关产品推荐
相关产品推荐

