如何计算C中大文件的MD5哈希值?

use*_*821 15 c hash md5

我正在用C语言编写OpenSSL库.

如何使用md5计算大文件的哈希值?

据我所知,我需要将整个文件作为char数组加载到RAM中,然后调用hash函数.但是如果文件大约是4Gb呢?听起来不错.

解决:感谢askovpen,我发现了我的错误.我用过

while ((bytes = fread (data, 1, 1024, inFile)) != 0)
    MD5_Update (&mdContext, data, 1024);
Run Code Online (Sandbox Code Playgroud)

while ((bytes = fread (data, 1, 1024, inFile)) != 0)
    MD5_Update (&mdContext, data, bytes);
Run Code Online (Sandbox Code Playgroud)

ask*_*pen 33

gcc -g -Wall -o file file.c -lssl -lcrypto

#include <stdio.h>
#include <openssl/md5.h>

int main()
{
    unsigned char c[MD5_DIGEST_LENGTH];
    char *filename="file.c";
    int i;
    FILE *inFile = fopen (filename, "rb");
    MD5_CTX mdContext;
    int bytes;
    unsigned char data[1024];

    if (inFile == NULL) {
        printf ("%s can't be opened.\n", filename);
        return 0;
    }

    MD5_Init (&mdContext);
    while ((bytes = fread (data, 1, 1024, inFile)) != 0)
        MD5_Update (&mdContext, data, bytes);
    MD5_Final (c,&mdContext);
    for(i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", c[i]);
    printf (" %s\n", filename);
    fclose (inFile);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果:

$ md5sum file.c
25a904b0e512ee546b3f47574703d9fc  file.c
$ ./file
25a904b0e512ee546b3f47574703d9fc file.c
Run Code Online (Sandbox Code Playgroud)


Dav*_*rtz 6

首先,MD5是一种散列算法.它不会加密任何东西.

无论如何,您可以以任何您喜欢的大小读取文件.调用MD5_Init一次,然后使用从文件中读取的每个数据块调用MD5_Update.完成后,调用MD5_Final获取结果.