数据结构应用--计算文件的MD5
2012-12-07 16:17
323 查看
0.序 1.方法1:利用MD5Init, MD5Update,MD5Final(没有得到正确md5) 2.利用他人编写好的库libleomd5.so 1)编译说明 2)程序中调用动态链接库.so 3.所需库文件 |
方法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; } |
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 */ |
另外,我不希望在使用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. |
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; } |
现在将这个文件及其官方的一个压缩包给出,这个压缩包里面有md5test2.c所需要的libleomd5.so文件。
注意MD5-SHA1.tar.bz2 的解压缩指令 tar jxvf MD5-SHA1.tar.bz2 其中的md5test.c是官方给出的测试文件,可以用于计算字符串和文件。
其下载地址 http://download.csdn.net/detail/yankai0219/4858430
相关文章推荐
- java计算过G文件md5 值计算
- 计算文件MD5
- 数据结构复习_栈和队列,应用_括号匹配&文件目录递归拷贝,
- python 文件MD5 SHA1校验计算
- 计算文件MD5的方法
- 文件 MD5、SHA1、SHA256 计算
- 转 这种方法可以免去自己计算大文件md5 的麻烦
- java使用计算md5校验码方式比较两个文件是否相同
- 关于java应用MD5校验文件和linux下md5Linux校验文件结果一致问题。
- 计算文件的MD5
- 使用Python计算指定目录md5,根据md5找查到相同的文件并打印
- 获取android应用签名证书(打包APK用到的那个文件)的SHA1,MD5,SHA256值
- 深度解析 Java 计算某个文件的 MD5 值的原理(附源码)
- python 计算文件的MD5
- 遍历目录下的所有文件,计算文件的md5并输出
- 用java计算文件MD5(文件hash)
- 使用webrtc中的MD5 API计算某个文件的MD5值
- JS计算文件的md5
- C# 计算字符串/文件的哈希值(MD5、SHA)
- shell for 循环、查看文件大小、计算文件md5