从OpenSSL库中分离算法-MD5算法-大文件MD5计算
续上述博客
小文件计算MD5时,可以把文件数据一次性都读到内存中计算,但当文件很大时,将文件一次性读到内存中是不可行的,此时,需要对文件数据分块进行MD5计算。具体方法如下:
跳转到实操视频
#include <iostream>
#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校验软件计算的结果:
完全一致
欢迎大家关注、留言讨论、可分享源码
|