我自己封装了一个函数GetMd5(LPCWSTR FileDirectory)。其中调用了windows api:CryptAcquireContext,CryptCreateHash,CryptHashData等。要计算不同文件的md5值,只需在调用此函数时传入不同文件的全路径即可,不需要额外的dll。示例代码在vs2008中测试通过:

#include "stdafx.h"
#include <iostream>
#include "windows.h"
using namespace std;void GetMd5(LPCWSTR FileDirectory)
{HANDLE hFile=CreateFile(FileDirectory,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);if (hFile==INVALID_HANDLE_VALUE)                                        //如果CreateFile调用失败{cout<<"CreateFile go wrong :"<<GetLastError()<<endl;                //提示CreateFile调用失败,并输出错误号。visual studio中可在“工具”>“错误查找”中利用错误号得到错误信息。CloseHandle(hFile);}HCRYPTPROV hProv=NULL;if(CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT)==FALSE)       //获得CSP中一个密钥容器的句柄{cout<<"CryptAcquireContext go wrong:"<<GetLastError()<<endl;}HCRYPTPROV hHash=NULL;if(CryptCreateHash(hProv,CALG_MD5,0,0,&hHash)==FALSE)     //初始化对数据流的hash,创建并返回一个与CSP的hash对象相关的句柄。这个句柄接下来将被CryptHashData调用。{cout<<"CryptCreateHash go wrong:"<<GetLastError()<<endl;}DWORD dwFileSize=GetFileSize(hFile,0);    //获取文件的大小if (dwFileSize==0xFFFFFFFF)               //如果获取文件大小失败{cout<<"GetFileSize go wrong:"<<GetLastError()<<endl;}byte* lpReadFileBuffer=new byte[dwFileSize];DWORD lpReadNumberOfBytes;if (ReadFile(hFile,lpReadFileBuffer,dwFileSize,&lpReadNumberOfBytes,NULL)==0)        //读取文件{cout<<"ReadFile go wrong:"<<GetLastError()<<endl;}if(CryptHashData(hHash,lpReadFileBuffer,lpReadNumberOfBytes,0)==FALSE)      //hash文件{cout<<"CryptHashData go wrong:"<<GetLastError()<<endl;}delete[] lpReadFileBuffer;CloseHandle(hFile);          //关闭文件句柄BYTE *pbHash;DWORD dwHashLen=sizeof(DWORD);//以下注释掉的代码不用使用,因为已经知道md5值就占32个字节,没有必要通过CryptGetHashParam函数来得到字节数。/*BYTE *pbHashSize;if (!(pbHashSize=(byte*)malloc(dwHashLen)))      //为pbHashSize分配内存{cout<<"memory allocation failed:"<<GetLastError()<<endl;}//将第二个参数的值设为HP_HASHSIZE。dwHashLen中存放着hash值的字节数。这个调用必须在将第三个参数设置为HP_HASHVAL的调用前,这样才能分配正确数量的内存。if (CryptGetHashParam(hHash,HP_HASHSIZE,pbHashSize,&dwHashLen,0))      {free(pbHashSize);}else{cout<<"get size go wrong"<<GetLastError()<<endl;}*/if (CryptGetHashParam(hHash,HP_HASHVAL,NULL,&dwHashLen,0))      //我也不知道为什么要先这样调用CryptGetHashParam,这块是参照的msdn       {}else{cout<<"get length wrong"<<endl;}if(pbHash=(byte*)malloc(dwHashLen)){}else{cout<<"allocation failed"<<endl;}if(CryptGetHashParam(hHash,HP_HASHVAL,pbHash,&dwHashLen,0))            //获得md5值{for(DWORD i=0;i<dwHashLen;i++)         //输出md5值{printf("%02x",pbHash[i]);}cout<<endl;}//善后工作if(CryptDestroyHash(hHash)==FALSE)          //销毁hash对象{cout<<"CryptDestroyHash go wrong:"<<GetLastError()<<endl;}if(CryptReleaseContext(hProv,0)==FALSE){cout<<"CryptReleaseContext go wrong:"<<GetLastError()<<endl;}
}int _tmain(int argc, _TCHAR* argv[])
{GetMd5(L"C:\\Windows\\System32\\kernel32.dll");system("pause");return 0;
}

此代码输出系统文件kernel32.dll的md5值,在我电脑上运行结果如下图所示:

用windows api 计算文件的md5值相关推荐

  1. Linux和Windows下计算文件的Hash值

    Linux和Windows下计算文件的Hash值 MD和SHA简介 MD SHA MD5 SHA1标识文件唯一性 Linux Windows 不需要下载工具,也不需要写代码. MD和SHA简介 MD ...

  2. linux 文件md5,Linux下计算文件的MD5值

    脚本功能 脚本使用Perl编写,计算文件的MD5值 脚本用途 服务器在安装完操作系统后,计算PATH变量里面所有的二进制文件的MD5.计算单个文件MD5值.计算某个目录(包括子目录)下所有的文件的MD ...

  3. c语言md5函数 linux,Linux下C语言计算文件的md5值(长度32)

    google了好久都没有找到合适的,其实我只需要一个函数,能计算文件的 md5 值就好, 后来找到了 md5.h 和 md5.c 的源文件,仿照别人的封装了个函数(他那个有问题,和 md5sum 计算 ...

  4. python3计算md5_python 计算文件的md5值实例

    较小文件处理方法: import hashlib import os def get_md5_01(file_path): md5 = None if os.path.isfile(file_path ...

  5. python计算文件md5值_用python计算文件的MD5值

    md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等.下面讲解在python中如何使用md5算法 ...

  6. 使用Java计算文件的MD5值(含修改MD5值的方法)

    什么是 MD5 ? MD5(Message Digest Algorithm,信息摘要算法),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保 ...

  7. java 文件的md5值_Java计算文件的MD5值

    import java.io.File; import java.io.FileInputStream; import java.math.BigInteger; import java.securi ...

  8. windows系统查看文件的MD5值方法

    使用键盘上 win + r 组合键,打开CMD命令窗口 然后输入命令 certutil -hashfile 文件名的绝对地址 MD5 注意:命令行的后面必须加的是MD5,如果没有MD5输出的就是别的值 ...

  9. Python中计算文件的MD5值

    MD5信息摘要算法(简称MD5),是一种被广泛使用的密码散列函数,可以产生一个32个字符的散列值(hash value),用于确保信息传输完整一致.在Python中一般是依赖于标准库的hashlib模 ...

最新文章

  1. UiBot带你两分钟看懂RPA是什么
  2. IdentityServer4 接口说明
  3. JNI基础 c语言调用java方法
  4. 对mysql的各种sql语句如何对表加锁的实验
  5. python进程的回收—wait
  6. vmware 搭建k8s无法ping通子节点_一波四折 —— 记一次K8S集群应用故障排查
  7. pandas filter_数据分析之Pandas操作(2)
  8. mysql 事务 库存_库存事务处理临时表
  9. 为啥一到秋季就鼻塞、流鼻涕、打喷嚏?该如何是好?别总当成感冒
  10. 秦始皇寻找长生药的始末
  11. 社招两年半10个公司28轮面试面经
  12. pythoninstaller打包 其他电脑无法运行_Pyininstaller一个软件包故障坑,Pyinstaller,打包,失败,的...
  13. react项目实战五 个人中心页面
  14. IPv4下,划分子网,构造超网(CIDR)
  15. Spring自定义AOP切面
  16. 第42课: Spark Broadcast内幕解密:Broadcast运行机制彻底解密、Broadcast源码解析、Broadcast最佳实践
  17. 网络推广100法,果然很强悍。
  18. python中opencv 与 PIL读图区别,以及与Numpy转换
  19. STM32的PWM和DAC练习中生成音频和波形
  20. kettle(4.1 TSV文件的抽取)

热门文章

  1. 欧姆龙变频器MX2参数_第442期丨【源程序】基于三菱西门子欧姆龙松下PLC实现喷水池控制系统;欧姆龙PLC编程软件更新步骤...
  2. 用flash做古诗动画_带孩子用两张A4纸做动画(内附资源可下载)
  3. HTML+CSS+JS实现 ❤️3D洞穴无限延伸动画特效❤️
  4. 放射性渐变色html,html5 canvas绘制放射性渐变色效果
  5. c语言成绩等级switch语句,请高手 帮忙做一道c语言题 编程,把百分制成绩转换成5级记分制,要求用switch语句。 90分以上(包括90):...
  6. java怎么设置多个输入_Java中从键盘输入多个整数的方法
  7. qq linux版本下载官网下载,腾讯QQ For Linux
  8. oracle单行子查询返回多个行 order by,单行子查询返回多个行 Issue分析求助
  9. Java 获取文件修改时间
  10. 鸿蒙行车记录仪,百度导航新增行车记录仪功能 可消除碰瓷风险