我使用OpenSSL库在C语言中写作。
如何使用md5计算大文件的哈希?
据我所知,我需要将整个文件作为char数组加载到RAM中,然后调用hash函数。但是如果文件大约是4Gb呢?听起来不错。
已解决:感谢askovpen,我发现了我的错误。我用过
while ((bytes = fread (data, 1, 1024, inFile)) != 0)
MD5_Update (&mdContext, data, 1024);
不
while ((bytes = fread (data, 1, 1024, inFile)) != 0)
MD5_Update (&mdContext, data, bytes);
答案 0 :(得分:31)
例如
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;
}
结果:
$ md5sum file.c
25a904b0e512ee546b3f47574703d9fc file.c
$ ./file
25a904b0e512ee546b3f47574703d9fc file.c
答案 1 :(得分:6)
首先,MD5是一种散列算法。它不会加密任何东西。
无论如何,你可以用你喜欢的任何大小的文件读取文件。调用MD5_Init一次,然后使用从文件中读取的每个数据块调用MD5_Update。完成后,请致电MD5_Final以获得结果。
答案 2 :(得分:3)
您不必立即将整个文件加载到内存中。您可以使用函数MD5_Init(), MD5_Update() and MD5_Final()以块的形式处理它以生成哈希。如果你担心它会成为一个&#34; atomic&#34;操作时,可能需要锁定文件以防止其他人在操作过程中更改它。
答案 3 :(得分:1)
最佳答案是正确的,但没有提及:对于每个使用的缓冲区大小,散列的值将不同。该值将在哈希值之间保持一致,因此相同的缓冲区大小将每次生成相同的哈希值,但是如果此哈希值将在以后与相同数据的哈希值进行比较,则必须为每个调用使用相同的缓冲区大小。
此外,如果你想确保你的摘要代码正常运行,并上网比较你的哈希与在线哈希网站,它们似乎使用缓冲区长度为1.这也带来了一个有趣的想法:它是使用缓冲区长度为1来散列大文件是完全可以接受的,它只需要更长的时间( duh )。
所以我的经验法则是,如果它仅供内部使用,那么我可以相应地为大文件设置缓冲区长度,但如果它必须与其他系统一起使用,那么将缓冲区长度设置为1并处理时间后果。
/src
-- event.json
-- users.handler.js
-- products.handler.js
-- serverless.yml