2012-10-17 42 views
0

我对c很新颖。我试图用md5比较两个文件。 我写了一个函数,它应该返回散列值。但是,比较不同文件或缓冲区的值时,它表示它们具有相同的散列值。C为不同的字符串获得相同的哈希值openssl

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

我总是得到缓冲区是平等的,即使他们不是。 Regards

回答

2

您应该在启用所有警告和调试信息的情况下进行编译,例如与Linux上的gcc -Wall -g

它会提醒你:函数返回地址变量

新手和专家的C程序员通常应该改进他们的代码,直到没有警告给出。如果你的代码触发了一个警告,你真的无法避免,你至少应该非常小心地评论为什么。

你不能有意义地返回一些本地数组的地址。

你可以return strdup(hashwert);并有调用函数(调用者)应该free结果的约定。

或者你可以有不同的API,例如hashwert是你函数的一个参数。

+0

是的,有一个警告,我用一个额外的缓冲区作为参数,而不是返回来修复它。谢谢! – user1324258

相关问题