您的位置:首页 > 理论基础 > 数据结构算法

数据结构应用--计算文件的MD5

2012-12-07 16:17 323 查看
0.序
1.方法1:利用MD5Init, MD5Update,MD5Final(没有得到正确md5)
2.利用他人编写好的库libleomd5.so
1)编译说明
2)程序中调用动态链接库.so
3.所需库文件
0.序
方法1:
常见的计算md5的方法是利用MD5Init, MD5Update,MD5Final等函数来计算文件的md5值,关于函数的一个详细介绍请见http://manpages.ubuntu.com/manpages/lucid/man3/md5.3bsd.html
方法2:
利用他人编写好的库来计算。
1.方法1:利用MD5Init, MD5Update,MD5Final
其程序如下:

/* 文件名:md5test.c
** 编辑: yankai
** 日期: 2012/12/07
*/
/* 在使用MD5init 等函数时,经常出现不能定义 MD5init 等情况。
解决方法
1. 安装apt-get
install libbsd
2. 编译时-lbsd
3. 编译命令gcc
-o md5test md5test.c -lbsd
4. 执行./md5test
5. 注意:本程序固定了文件的路径,因此在测试时,需要手动修改文件的路径,文件才能正确执行
6. 注意:该程序并没有得到正确的 md5 值,还请大家指正
*/
#include <openssl/md5.h>
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#define MD5_DIGEST_LENGTH 16
typedef struct ngx_http_upload_md5_ctx_s
{
MD5_CTX md5;
u_char md5_digest[MD5_DIGEST_LENGTH * 2];
} ngx_http_upload_md5_ctx_t;
int main()
{
u_char * file_path = "/home/hpnl/Downloads/test/md5/123.txt" ;
ngx_http_upload_md5_ctx_t *md5_ctx = NULL;
md5_ctx = (ngx_http_upload_md5_ctx_t*)malloc(sizeof (ngx_http_upload_md5_ctx_t));
if(NULL
== md5_ctx){
printf( "malloc error\n");
return 0;
}
MD5Init(&md5_ctx->md5);
FILE *pfile;
int buffer_size
= 1024;
int read_size
= 0;
unsigned char *
buffer = (unsigned char*)malloc(sizeof (unsigned char)
* buffer_size);
if((pfile
= fopen((char *)file_path,"rb"))
== NULL)
return 1;
while(
(read_size = fread(buffer,1,buffer_size,pfile)) != EOF){
MD5Update(&md5_ctx->md5,buffer,read_size);
if(read_size
< buffer_size)
break;
}
MD5Final(md5_ctx->md5_digest,&md5_ctx->md5);
printf( "upload_ctx->yk_md5_ctx:->md5_digest :%s\n",md5_ctx->md5_digest);
free(buffer);
return 0;
}
2.利用他人编写好的库libleomd5.so
1)编译说明

/*

* 编译方法

*

* gcc -o md5test md5test.c libleomd5.so

* 此方法需要将libleomd5.so复制到系统路径下,例如/usr/lib

*

* gcc -o md5test md5test.c ./libleomd5.so

* 此方法需要将libleomd5.so复制到test所在路径下

*

* bayern.leo@gmail.com

*/
2)程序中调用动态链接库.so
另外,我不希望在使用gcc编译的时候添加动态链接库,我更希望的是使用库文件。那么我该如何进行呢?通过搜索,我发现可以 使用dlopen函数在程序中添加动态链接库。当然在编译的时候还需要添加dlopen函数所在的lib文件。

在linux中man dlopen
NAME

dladdr, dlclose, dlerror, dlopen, dlsym, dlvsym - programming interface to dynamic linking loader

SYNOPSIS

#include <dlfcn.h>

void *dlopen(const char *filename, int flag);

char *dlerror(void);

void *dlsym(void *handle, const char *symbol);

int dlclose(void *handle);

Link with -ldl.
关于dlopen的使用,有一个简单例子详见:http://blog.csdn.net/smallsky_keke/article/details/7372184

3)libleomd5.so动态文件计算文件md5
现在我将利用libleomd5.so动态文件计算文件md5的程序列出

/* 文件名:md5test2.c
** 编辑:yankai
** 日期:2012/12/07
*/
/*
1. 编译命令gcc
-o md5test2 md5test2.c -ldl
2. 执行/md5test2
3. 注意:本程序固定了文件的路径,因此在测试时,需要手动修改文件的路径,文件才能正确执行
4. 注意:需要将libleomd5.so文件放于/usr/lib/目录下,其实只要与dlopen的路径一致即可
*/
#include<dlfcn.h>
#include<string.h>
int *(*pnMDFile)(char *);
#define FILE_MD5_LEN 33
int main(int argc,char*
argv[]) {
void *pdlHandle
= dlopen("/usr/lib/libleomd5.so" ,RTLD_LAZY);
pnMDFile=dlsym(pdlHandle, "MDFile");
char *
file_md5;
char *
filepath = "/home/hpnl/Downloads/test/md5/123.txt" ;

file_md5 = ( char*)malloc(sizeof (char)
* FILE_MD5_LEN);
strncpy(file_md5,( char*)pnMDFile(filepath),strlen((char *)pnMDFile(filepath))
);
*(file_md5 + FILE_MD5_LEN -1) = '\0';
printf( "For file %s len %d\n",file_md5,strlen(file_md5));
dlclose(pdlHandle);
return 0;
}
3.所需库文件
现在将这个文件及其官方的一个压缩包给出,这个压缩包里面有md5test2.c所需要的libleomd5.so文件。
注意MD5-SHA1.tar.bz2 的解压缩指令 tar jxvf MD5-SHA1.tar.bz2 其中的md5test.c是官方给出的测试文件,可以用于计算字符串和文件。
其下载地址 http://download.csdn.net/detail/yankai0219/4858430


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: