python计算文件的md5值
前言
最近要开发一个基于python的合并文件夹/目录的程序,本来的想法是基于修改时间的比较,即判断文件有没有改变,比较两个文件的修改时间即可。这个想法在windows的pc端下测试没有问题。
但是当把一个文件从pc端复制到优盘时出现了一个问题,复制到优盘的文件比pc端的文件慢了两秒钟!
这里我用的复制函数是 shutil.copy2(),理论上它会把修改时间和最后访问时间也复制过来1,但是实际情况并不是完全相同。
详细情况我在segmentfault里提出了问题:为什么将一个文件从pc中复制到优盘中修改时间会慢2秒钟?
看shutil.copy2的资料和网上的解答,发现可能是文件系统的差别造成的,windows的pc端文件系统是ntfs,优盘的是fat32。但还是想了解更深层的原因,希望知道的大神解答一下。
扯远了,基于以上问题的出现,迫使我得修改比较策略,于是我找到了用文件的MD5值比较的方法,yeah!~
具体来说,每个文件都会有一个MD5的加密值,这个值来唯一标识这个文件(百度云的快速上传/秒传就是基于这个道理),它常用来辨别文件的真伪,例如下载系统安装镜像,旁边会附带一个长长的字符乱码,这就是这个镜像的MD5值。
文件被修改后其MD5值也会改变,所以可以用来判断一个文件是否被修改过。
这样的方法比基于时间的比较显然更加可靠,现在唯一的问题就是MD5计算时间的问题。一个大文件计算MD5值要多久呢?
网上的解决代码已经有很多了,大都是两种方法,一种是小文件的MD5加密,调用函数直接加密即可,另一种是大文件的MD5加密策略,方法是将大文件分块更新MD5值,最后得到最终的值。
下面我使用第二种方法对大文件进行加密测试。
测试1
测试对象是一个将近2G的压缩文件,如下:

加密结果如下:

运行时间是20s,不快也不慢,相对文件大小来说,我还是能接受这个速度……
计算出的MD5值是“8ee04176f69c10ca56f2358d51d792ed”,这个值对不对呢?我在网上做了验证:

两个值相等,由此可见该算法,计算正确。测试代码见下。
测试网址在这:http://www.atool.org/file_hash.php
有趣的是,我对文件进行了第二次、第三次、第四次加密,发现加密时间少了5秒左右,好神奇,不知道为什么。
搞定了MD5加密,我可以继续进行下一步开发了~ :)

大文件的MD5加密代码
# coding=gbk import hashlib
import os
import datetime def GetFileMd5(filename):
if not os.path.isfile(filename):
return
myhash = hashlib.md5()
f = open(filename,'rb')
while True:
b = f.read(8096)
if not b :
break
myhash.update(b)
f.close()
return myhash.hexdigest() filepath = raw_input('请输入文件路径:') # 输出文件的md5值以及记录运行时间
starttime = datetime.datetime.now()
print GetFileMd5(filepath)
endtime = datetime.datetime.now()
print '运行时间:%ds'%((endtime-starttime).seconds)
参考资料
原创声明
Freecode# : www.cnblogs.com/yym2013
python计算文件的md5值的更多相关文章
- C#计算文件的MD5值实例
C#计算文件的MD5值实例 MD5 是 Message Digest Algorithm 5(信息摘要算法)的缩写,MD5 一种散列(Hash)技术,广泛用于加密.解密.数据签名和数据完整性校验等方面 ...
- python检测文件的MD5值
python检测文件的MD5值MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权 ...
- c#计算文件的MD5值
代码: /// <summary> /// 计算文件的 MD5 值 /// </summary> /// <param name="fileName" ...
- 计算文件的MD5值和sha256值
1.计算文件的MD5值. 1)linux系统计算 MD5值:md5sum+文件名 sha256值:sha256su+文件名 2)windows系统计算 MD5值:利用Notepad++工具计算 sha ...
- 在.NET中计算文件的MD5值
更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 直接上代码吧: using System; using System.IO; using System.Security. ...
- 计算文件的MD5值(Java & Rust)
Java public class TestFileMD5 { public final static String[] hexDigits = { "0", "1&qu ...
- python 计算文件md5值
md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等.下面讲解在python中如何使用md5算法 ...
- 计算字符串和文件的MD5值
//计算字符串的MD5值 public string GetMD5(string sDataIn) { MD5CryptoServiceProvider md5 = new MD5CryptoServ ...
- 计算指定文件的MD5值
/// <summary> /// 计算指定文件的MD5值 /// </summary> /// <param name="fileName"> ...
随机推荐
- 【USACO 2.4 】Bessie Come Home
题意:给出n条有权的双向边(10000),求到达Z最近的大写字母,及其距离. 题解:即求Z出发的最短路,用dijstra就可以了,注意边要开到20000以上. /* TASK: comehome LA ...
- 使用jquery脚本获取随笔、文章和评论的统计数,自定义显示位置
为了这个问题,花了好些时间去摸索,无奈没有搞定.于是,我就到博问去提问,终于搞定! 在此,非常感谢SeayXu的热心帮助. 1.在需要的位置添加一个标签 <div id="stats_ ...
- 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法
3039: 玉蟾宫 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 753 Solved: 444[Submit][Status][Discuss] D ...
- HttpClient 4.3 使用
httpclient的api变化很快,本篇随笔记录自己使用4.3.6版本时所做的设置.版本虽然不是最新,但达到了目的就行. maven依赖: <dependency> <groupI ...
- RabbitMQ 消息确认机制
消息确认机制 在之前异常处理部分就已经写了,对于consumer的异常退出导致消息丢失,可以时候consumer的消息确认机制.重复的就不说了,这里说一些不一样的. consumer的消息确认机制 当 ...
- Iptables防火墙NAT地址转换与端口转发
开启系统转发功能: [root@localhost /]# vim /etc/sysctl.conf # Generated by iptables-save v1.4.7 on Thu May 12 ...
- Log4net中换行符
在log4net节点中 <appender name="DebugLogFileAppender" type="log4net.Appender.FileAppen ...
- 【Linux】使用update-alternatives命令进行版本的切换
引言 在Redhat中也有此功能,用于切换不同版本. 在Debian系统中,我们可能会同时安装有很多功能类似的程序和可选配置,可能会出现同一软件的多个版本并存的场景.比如像是一些编程语言工具,一些系统 ...
- 程序代码中退出函数exit()与返回函数return ()的区别
程序代码中退出函数exit()与返回函数return ()的区别 exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在主函数 ...
- BCP导出导入大容量数据实践
前言 SQL SERVER提供多种不同的数据导出导入的工具,也可以编写SQL脚本,使用存储过程,生成所需的数据文件,甚至可以生成包含SQL语句和数据的脚本文件.各有优缺点,以适用不同的需求.下面介绍大 ...