linux c 算md5值函数,Linux C中的md5sum文件

如果您要为文件生成MD5哈希并将其与字符串进行比较,则可以使用此方法。

在这里,我使用了来自另一个SO答案的D'Nabre的代码和Michael Foukarakis的十六进制字符串到这个SO答案的字节数组代码。

它需要与OpenSSL库(gcc md5.c -o md5 -lssl)链接才能工作。

样品用法:

unsigned char *file_hash = md5_for_file("~/testfile");

if (md5_is_match_str(file_hash, "b7be4ec867f9b0286b91dd40178774d6")) {

printf("Matchn");

} else {

printf("Mismatchn");

}

free(file_hash);

md5.h:

#ifndef MD5_H

#define MD5_H

/** Caller to free result */

unsigned char *md5_for_file(char *filename);

/** md5_1 & md5_2 maybe NULL */

int md5_is_match(unsigned char *md5_1, unsigned char *md5_2);

/** md5 maybe NULL */

int md5_is_match_str(unsigned char *md5, const char *md5_str);

#endif //MD5_H

md5.c:

#include "md5.h"

#include

#include

#include

#include

#include

#include

#include

#include

// Print the MD5 sum as hex-digits.

void print_md5_sum(unsigned char *md) {

int i;

for (i = 0; i < MD5_DIGEST_LENGTH; i++) {

printf("%02x", md[i]);

}

printf("n");

}

// Get the size of the file by its file descriptor

unsigned long get_size_by_fd(int fd) {

struct stat statbuf;

if (fstat(fd, &statbuf) < 0) exit(-1);

return statbuf.st_size;

}

unsigned char *md5_for_file(char *filename) {

int file_descript;

unsigned long file_size;

char *file_buffer;

unsigned char *result = malloc(sizeof(*result) * MD5_DIGEST_LENGTH);

if (NULL == result) {

printf("malloc failedn");

goto END;

}

printf("using file:t%sn", filename);

file_descript = open(filename, O_RDONLY);

if (file_descript < 0) exit(-1);

file_size = get_size_by_fd(file_descript);

printf("file size:t%lun", file_size);

file_buffer = mmap(0, file_size, PROT_READ, MAP_SHARED, file_descript, 0);

MD5((unsigned char *) file_buffer, file_size, result);

munmap(file_buffer, file_size);

print_md5_sum(result);

END:

return result;

}

int md5_is_match(unsigned char *md5_1, unsigned char *md5_2) {

if (!md5_1 || !md5_2) {

return 0;

}

int i;

for (i = 0; i < MD5_DIGEST_LENGTH; i++) {

if (md5_1[i] != md5_2[i]) {

return 0;

}

}

return 1;

}

int md5_is_match_str(unsigned char *md5, char *md5_str) {

if (!md5 || !md5_str) { return 0; }

/** Make byte arrary from md5_str */

unsigned char md5_arr[MD5_DIGEST_LENGTH] = {0};

const char *pos = md5_str;

size_t count = 0;

/* WARNING: no sanitization or error-checking whatsoever */

for (count = 0; count < sizeof(md5_arr) / sizeof(md5_arr[0]); count++) {

sscanf(pos, "%2hhx", &md5_arr[count]);

pos += 2;

}

for (count = 0; count < sizeof(md5_arr) / sizeof(md5_arr[0]); count++) {

printf("%02x", md5_arr[count]);

}

printf("n");

/** actual comparison */

if (memcmp(md5, md5_arr, MD5_DIGEST_LENGTH)) {

return 0;

}

return 1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值