2012-10-17 81 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

相關問題