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

这篇博客介绍了计算文件MD5的两种方法:一是利用MD5Init, MD5Update, MD5Final等函数;二是使用他人编写的库libleomd5.so。对于第二种方法,还讲解了如何在不直接链接动态库的情况下,通过dlopen函数在程序运行时加载动态链接库。" 105233760,7514714,理解ThinkPHP3.2的目录访问结构,"['php', 'thinkphp', '框架开发', 'MVC结构', 'web开发']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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是官方给出的测试文件,可以用于计算字符串和文件。

   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值