我正在用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)
首先,MD5是一种散列算法.它不会加密任何东西.
无论如何,您可以以任何您喜欢的大小读取文件.调用MD5_Init一次,然后使用从文件中读取的每个数据块调用MD5_Update.完成后,调用MD5_Final获取结果.