Linux下C语言计算文件的md5值(长度32)

进击的代码 2024-10-15 20:10:34

概览

Google 了好久都没有找到合适的,其实我只需要一个函数,能计算文件的 md5 值就好,

后来找到了 md5.h 和 md5.c 的源文件,仿照别人的封装了个函数(他那个有问题,和 md5sum 计算出来的都不一样)。

废话少说,直接贴代码: (再废一句话,如果只想计算字符串的md5值,把字符串传给 MD5Update 函数一次就好,示例:https://github.com/chinaran/Compute-file-or-string-md5/blob/master/main_md5.c#L49)

源码

(github 源码下载: https://github.com/chinaran/Compute-file-or-string-md5)

#include "md5.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#define READ_DATA_SIZE 1024

#define MD5_SIZE 16

#define MD5_STR_LEN (MD5_SIZE * 2)

// function declare

int Compute_string_md5(unsigned char *dest_str, unsigned int dest_len, char *md5_str);

int Compute_file_md5(const char *file_path, char *md5_str);

/************** main test **************/

int main(int argc, char *argv[])

{

int ret;

const char *file_path = "md5.c";

char md5_str[MD5_STR_LEN + 1];

const char *test_str = "gchinaran@gmail.com";

// test file md5

ret = Compute_file_md5(file_path, md5_str);

if (0 == ret)

{

printf("[file - %s] md5 value:\n", file_path);

printf("%s\n", md5_str);

}

// test string md5

Compute_string_md5((unsigned char *)test_str, strlen(test_str), md5_str);

printf("[string - %s] md5 value:\n", test_str);

printf("%s\n", md5_str);

return 0;

}

/**

* compute the value of a string

* @param  dest_str

* @param  dest_len

* @param  md5_str

*/

int Compute_string_md5(unsigned char *dest_str, unsigned int dest_len, char *md5_str)

{

int i;

unsigned char md5_value[MD5_SIZE];

MD5_CTX md5;

// init md5

MD5Init(&md5);

MD5Update(&md5, dest_str, dest_len);

MD5Final(&md5, md5_value);

// convert md5 value to md5 string

for(i = 0; i < MD5_SIZE; i++)

{

snprintf(md5_str + i*2, 2+1, "%02x", md5_value[i]);

}

return 0;

}

/**

* compute the value of a file

* @param  file_path

* @param  md5_str

* @return 0: ok, -1: fail

*/

int Compute_file_md5(const char *file_path, char *md5_str)

{

int i;

int fd;

int ret;

unsigned char data[READ_DATA_SIZE];

unsigned char md5_value[MD5_SIZE];

MD5_CTX md5;

fd = open(file_path, O_RDONLY);

if (-1 == fd)

{

perror("open");

return -1;

}

// init md5

MD5Init(&md5);

while (1)

{

ret = read(fd, data, READ_DATA_SIZE);

if (-1 == ret)

{

perror("read");

close(fd);

return -1;

}

MD5Update(&md5, data, ret);

if (0 == ret || ret < READ_DATA_SIZE)

{

break;

}

}

close(fd);

MD5Final(&md5, md5_value);

// convert md5 value to md5 string

for(i = 0; i < MD5_SIZE; i++)

{

snprintf(md5_str + i*2, 2+1, "%02x", md5_value[i]);

}

return 0;

}

运行效果

0 阅读:0

进击的代码

简介:程序员,分享生活、工作、技术、学习。