我对c很新。我想用md5比较两个文件。 我写了一个应该返回哈希值的函数。但是在比较不同文件或缓冲区的值时,它表示它们具有相同的哈希值。
unsigned char* getMD5(void *buffer, size_t bsize) {
EVP_MD_CTX *mdctx;
const EVP_MD *md;
unsigned char hashwert[EVP_MAX_MD_SIZE];
int hashwert_laenge;
OpenSSL_add_all_digests();
md = EVP_get_digestbyname("MD5");
mdctx = EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, buffer, bsize);
EVP_DigestFinal_ex(mdctx, hashwert, &hashwert_laenge);
EVP_MD_CTX_destroy(mdctx);
return hashwert;
}
//in main...
char mess[] = "abc";
cahr mess2[] = "bcd";
if(strcmp(getMD5(mess, strlen(mess)),getMD5(mess2, strlen(mess2))==0) {
printf("euqal\n");
}else {
printf("not equal \n");
}
我总是得到缓冲区是相等的,即使它们不是。 此致
答案 0 :(得分:2)
您应该编译时启用所有警告和调试信息,例如在Linux上使用gcc -Wall -g
。
它会警告你:函数返回局部变量的地址。
新手和专家C程序员通常应该改进他们的代码,直到没有给出警告。如果您的代码触发了一个您无法避免的警告,那么至少应该仔细评论原因。
您无法有意义地返回某些本地数组的地址。
你可以return strdup(hashwert);
并且具有调用函数(调用者)应该free
结果的约定。
或者您可以使用不同的API,例如hashwert
是您的函数的参数。