0

私はcにかなり慣れていません。2つのファイルを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"); 
}

たとえそうでなくても、私は常にバッファが等しいことを知っています。よろしく

4

1 に答える 1

2

Linuxの場合など、すべての警告を有効にしてデバッグ情報を使用してコンパイルする必要がありますgcc -Wall -g

警告が表示されます。関数はローカル変数のアドレスを返します

初心者やエキスパートCプログラマーは通常、警告が表示されなくなるまでコードを改善する必要があります。コードが本当に避けられないという警告をトリガーする場合は、少なくともその理由を非常に注意深くコメントする必要があります。

一部のローカル配列のアドレスを意味のある形で返すことはできません。

return strdup(hashwert);呼び出し元の関数(呼び出し元)が結果を出す必要があるという慣習がありますfree

または、別のAPIを使用することもできます。たとえばhashwert、関数のパラメーターにすることができます。

于 2012-10-17T10:29:33.940 に答える