python读取文件md5_python计算文件的md5值

前言

最近要开发一个基于python的合并文件夹/目录的程序,本来的想法是基于修改时间的比较,即判断文件有没有改变,比较两个文件的修改时间即可。这个想法在windows的pc端下测试没有问题。

但是当把一个文件从pc端复制到优盘时出现了一个问题,复制到优盘的文件比pc端的文件慢了两秒钟!

这里我用的复制函数是 shutil.copy2(),理论上它会把修改时间和最后访问时间也复制过来1,但是实际情况并不是完全相同。

看shutil.copy2的资料和网上的解答,发现可能是文件系统的差别造成的,windows的pc端文件系统是ntfs,优盘的是fat32。但还是想了解更深层的原因,希望知道的大神解答一下。

扯远了,基于以上问题的出现,迫使我得修改比较策略,于是我找到了用文件的MD5值比较的方法,yeah!~

具体来说,每个文件都会有一个MD5的加密值,这个值来唯一标识这个文件(百度云的快速上传/秒传就是基于这个道理),它常用来辨别文件的真伪,例如下载系统安装镜像,旁边会附带一个长长的字符乱码,这就是这个镜像的MD5值。

文件被修改后其MD5值也会改变,所以可以用来判断一个文件是否被修改过。

这样的方法比基于时间的比较显然更加可靠,现在唯一的问题就是MD5计算时间的问题。一个大文件计算MD5值要多久呢?

网上的解决代码已经有很多了,大都是两种方法,一种是小文件的MD5加密,调用函数直接加密即可,另一种是大文件的MD5加密策略,方法是将大文件分块更新MD5值,最后得到最终的值。

下面我使用第二种方法对大文件进行加密测试。

测试1

测试对象是一个将近2G的压缩文件,如下:

521482-20160511173352530-1129362661.png

加密结果如下:

521482-20160511173640499-157863275.png

运行时间是20s,不快也不慢,相对文件大小来说,我还是能接受这个速度……

计算出的MD5值是“8ee04176f69c10ca56f2358d51d792ed”,这个值对不对呢?我在网上做了验证:

521482-20160511174932874-1300502634.png

两个值相等,由此可见该算法,计算正确。测试代码见下。

有趣的是,我对文件进行了第二次、第三次、第四次加密,发现加密时间少了5秒左右,好神奇,不知道为什么。

搞定了MD5加密,我可以继续进行下一步开发了~ :)

521482-20160511173950952-1493299111.png

大文件的MD5加密代码

1 #coding=gbk

2

3 importhashlib4 importos5 importdatetime6

7 defGetFileMd5(filename):8 if notos.path.isfile(filename):9 return

10 myhash =hashlib.md5()11 f = open(filename,'rb')12 whileTrue:13 b = f.read(8096)14 if notb :15 break

16 myhash.update(b)17 f.close()18 returnmyhash.hexdigest()19

20 filepath = raw_input('请输入文件路径:')21

22 #输出文件的md5值以及记录运行时间

23 starttime =datetime.datetime.now()24 printGetFileMd5(filepath)25 endtime =datetime.datetime.now()26 print '运行时间:%ds'%((endtime-starttime).seconds)

参考资料

原创声明

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值