我对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");
}


我总是得到缓冲区相等,即使它们不相等。
问候

最佳答案

您应该编译所有已启用的警告和调试信息,例如在Linux上使用gcc -Wall -g

它会警告您:函数返回局部变量的地址。

新手和专业C程序员通常应改进其代码,直到没有任何警告。如果您的代码触发了您确实无法避免的警告,则至少应非常谨慎地注释原因。

您无法有意义地返回某些本地数组的地址。

您可以return strdup(hashwert);并约定调用函数(调用方)应free结果。

或者您可以使用其他API,例如将hashwert作为函数的参数。

10-07 17:16