【技术篇】文件的md5值

前言:

         我们以一个wrold文档为例,新建一个xx.docx文件,然后在Linux下可以使用命令md5sum xx.docx计算md5值 -》835741aba850778a5b06bfd57f55c98c 。然后我在复制了一下这个文件,并将文件名改为yy.docx,然后重复上面的命令去计算这个新文件的md5值,然后得到的是相同的结果,文件的md5值是我在我们一个项目“文件传输”中用到的,一开始用这个只知道是用来判断两个文件的内容是否相同,用的是老师给的一个借口,项目写完已经很久了,这个文件的md5值是最近在面试的时候被面试官问到了,所以现在回过来看一看这个,其实这个是用来做加密的,我也不太了解,是在网上看的,关于机密什么的就先不说了,先来看看他是怎么在项目中用代码实现的把!

(一)函数介绍

//打开/usr/include/openssl/md5.h这个文件我们可以看到一些函数
 
// 初始化 MD5 Contex, 成功返回1,失败返回0
 
int MD5_Init(MD5_CTX *c);
 
// 循环调用此函数,可以将不同的数据加在一起计算MD5,成功返回1,失败返回0
 
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
 
// 输出MD5结果数据,成功返回1,失败返回0
 
int MD5_Final(unsigned char *md, MD5_CTX *c);
 
// MD5_Init,MD5_Update,MD5_Final三个函数的组合,直接计算出MD5的值
 
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
 
// 内部函数,不需要调用
 
void MD5_Transform(MD5_CTX *c, const unsigned char *b);

(二)代码演示

#include 
#include 
#include 
#include 
#include 
using namespace std;

int main()
{
    MD5_CTX ctx;
    unsigned char outmd[16];
    char buffer[1024];
    char filename[32];
    FILE* fp = NULL;
    int len = 0, i = 0;

    memset(outmd, 0, sizeof(outmd));
    memset(filename, 0, sizeof(filename));
    memset(buffer, 0, sizeof(buffer));

    cout << "please enter file name:";
    cin >> filename;

    if((fp = fopen(filename, "rb")) == NULL)
    {
        cout << "file open error!"<< endl;
        return 0;
    }

    MD5_Init(&ctx);
    while((len = fread(buffer, 1, 1024, fp)) > 0 )
    {
        MD5_Update(&ctx, buffer, len);
        memset(buffer, 0, sizeof(buffer));
    }

    MD5_Final(outmd, &ctx);

    for(i = 0; i < 16; i++)
    {
        printf("%02X", outmd[i]);
    }
    cout << endl;
    return 0;

}

结果:

【技术篇】文件的md5值_第1张图片

注:编译命令为g++ - o main main.cpp -lssl加上库名。

参考文章:https://blog.csdn.net/eunice_fan1207/article/details/86312754

 

你可能感兴趣的:(linux)