续上述博客
小文件计算MD5时,可以把文件数据一次性都读到内存中计算,但当文件很大时,将文件一次性读到内存中是不可行的,此时,需要对文件数据分块进行MD5计算。具体方法如下:
跳转到实操视频
C语言计算大文件MD5
#include#include "md5/md5.h" #define BlockSize 1024 //512整数倍 int main() { unsigned char md[MD5_DIGEST_LENGTH] = { 0 }; MD5_CTX C; MD5_Init(&C); FILE* Fp = nullptr; fopen_s(&Fp, "e:\软件备份\Anaconda3-2020.11-Windows-x86_64.exe", "rb"); if (Fp) { unsigned char Data[BlockSize] = { 0 }; while(1) { int ReadLen = fread(Data, 1, BlockSize, Fp); //每次读取BlockSize大小的文件数据 if (ReadLen == 0) { break; } MD5_Update(&C, Data, ReadLen); } MD5_Final(md, &C); for (int i = 0; i < MD5_DIGEST_LENGTH; i++) { printf("%02x-", *(md + i)); } fclose(Fp); } }
MD5算法在计算时,是采用512一分组的方式,因此在定义分区BlockSize时,应采用512的整数倍,但OpenSSL库中的MD5算法,分块大小不是512整数倍,也并不影响最终结果。
输出结果:
08-41-ff-cb-92-7a-3c-2e-db-d6-82-52-0f-52-e5-46-
使用md5校验软件计算的结果:
完全一致
欢迎大家关注、留言讨论、可分享源码



