一番上の答えは正しいですが、何も言及していませんでした: ハッシュの値は、使用されるバッファ サイズごとに異なります。値はハッシュ全体で一貫しているため、同じバッファ サイズは毎回同じハッシュを生成しますが、後でこのハッシュを同じデータのハッシュと比較する場合は、呼び出しごとに同じバッファ サイズを使用する必要があります。
さらに、ダイジェスト コードが正しく機能することを確認し、オンラインでハッシュをオンラインのハッシュ Web サイトと比較したい場合、それらはバッファ長 1 を使用しているようです。これはまた、興味深い考えをもたらします。バッファ長 1 を使用して大きなファイルをハッシュすると、時間がかかります ( duh )。
したがって、私の経験則では、内部使用のみの場合は、大きなファイルに応じてバッファ長を設定できますが、他のシステムとうまく連携する必要がある場合は、バッファ長を 1 に設定し、時間の結果に対処します。 .
int hashTargetFile(FILE* fp, unsigned char** md_value, int *md_len) {
#define FILE_BUFFER_LENGTH 1
EVP_MD_CTX *mdctx;
const EVP_MD *md;
int diglen; //digest length
int arrlen = sizeof(char)*EVP_MAX_MD_SIZE + 1;
int arrlen2 = sizeof(char)*FILE_BUFFER_LENGTH + 1;
unsigned char *digest_value = (char*)malloc(arrlen);
char *data = (char*)malloc(arrlen2);
size_t bytes; //# of bytes read from file
mdctx = EVP_MD_CTX_new();
md = EVP_sha512();
if (!mdctx) {
fprintf(stderr, "Error while creating digest context.\n");
return 0;
}
if (!EVP_DigestInit_ex(mdctx, md, NULL)) {
fprintf(stderr, "Error while initializing digest context.\n");
return 0;
}
while (bytes = fread(data, 1, FILE_BUFFER_LENGTH, fp) != 0) {
if (!EVP_DigestUpdate(mdctx, data, bytes)) {
fprintf(stderr, "Error while digesting file.\n");
return 0;
}
}
if (!EVP_DigestFinal_ex(mdctx, digest_value, &diglen)) {
fprintf(stderr, "Error while finalizing digest.\n");
return 0;
}
*md_value = digest_value;
*md_len = diglen;
EVP_MD_CTX_free(mdctx);
return 1;
}