在linux机器上,有一个命令可以计算出文件的md5值,那就是md5sum,如果没有的话,就需要安装RPM包:coreutils。
现在我们使用openssl的库也可以方便的计算出文件的md5值。主要用到的函数是
int MD5_Init(MD5_CTX *c);
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
int MD5_Final(unsigned char *md, MD5_CTX *c);
使用库前,先需要安装openssl的RPM包。这三个函数不需要解释,看下面一个例子就知道:
g++ test.cpp -o testmd5 -lcrypto -lssl
生成testmd5后,我们把一个300多M的test文件放到与testmd5一个目录。并把testmd5生成的结果和linux命令"md5sum test" 结果对比,会发现是一样的。
int GetFileMD5(std::string strFile, std::string& strMD5)
{
int nLen = 0;
unsigned int nBufferSize = 1024 * 1024;
char szTemp[4];
unsigned char szMD5[20];
MD5_CTX ctx;
// set buffer size by file size
ACE_stat stFileInfo;
memset(&stFileInfo, 0, sizeof(ACE_stat));
nRet = ACE_OS::lstat(strFile.c_str(), &stFileInfo);
if (nRet != 0)
{
printf("stat file error[%s].\n", strFile.c_str());
return -1;
}
if (stFileInfo.st_size < nBufferSize)
{
nBufferSize = stFileInfo.st_size + 64;
}
// open file
FILE *fp = fopen(strFile.c_str(), "r");
if(fd == NULL)
{
printf("fopen error:%s.\n", strFile.c_str());
return -1;
}
unsigned char *pDataBuffer = (unsigned char*)malloc(nBufferSize);
if(NULL == pDataBuffer)
{
printf("malloc error:%d.\n", nBufferSize);
fclose(fp)
return -1;
}
// get md5
MD5_Init(&ctx);
while(true)
{
memset(pDataBuffer, 0, nBufferSize);
nLen = fread(pDataBuffer, 1, nBufferSize, fp);
if(nLen == 0)
{
break;
}
MD5_Update(&ctx, pDataBuffer, nLen);
}
MD5_Final(szMD5, &ctx);
// md5 to string
strMD5 = "";
for(int i = 0; i < 16; i++)
{
memset(szTemp, 0, sizeof(szTemp));
snprintf(szTemp, sizeof(szTemp), "%02x", (int)szMD5[i]);
strMD5 += szTemp;
}
fclose(fp);
if(NULL != pDataBuffer)
{
free(pDataBuffer);
pDataBuffer = NULL;
}
return 0;
}