前言

  最近要开发一个基于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)

参考资料

Python中os和shutil模块实用方法集锦

python检测文件的MD5值

原创声明

Freecode# : www.cnblogs.com/yym2013

python计算文件的md5值的更多相关文章

  1. C#计算文件的MD5值实例

    C#计算文件的MD5值实例 MD5 是 Message Digest Algorithm 5(信息摘要算法)的缩写,MD5 一种散列(Hash)技术,广泛用于加密.解密.数据签名和数据完整性校验等方面 ...

  2. python检测文件的MD5值

    python检测文件的MD5值MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权 ...

  3. c#计算文件的MD5值

    代码: /// <summary> /// 计算文件的 MD5 值 /// </summary> /// <param name="fileName" ...

  4. 计算文件的MD5值和sha256值

    1.计算文件的MD5值. 1)linux系统计算 MD5值:md5sum+文件名 sha256值:sha256su+文件名 2)windows系统计算 MD5值:利用Notepad++工具计算 sha ...

  5. 在.NET中计算文件的MD5值

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 直接上代码吧: using System; using System.IO; using System.Security. ...

  6. 计算文件的MD5值(Java & Rust)

    Java public class TestFileMD5 { public final static String[] hexDigits = { "0", "1&qu ...

  7. python 计算文件md5值

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

  8. 计算字符串和文件的MD5值

    //计算字符串的MD5值 public string GetMD5(string sDataIn) { MD5CryptoServiceProvider md5 = new MD5CryptoServ ...

  9. 计算指定文件的MD5值

    /// <summary> /// 计算指定文件的MD5值 /// </summary> /// <param name="fileName"> ...

随机推荐

  1. 【USACO 2.4 】Bessie Come Home

    题意:给出n条有权的双向边(10000),求到达Z最近的大写字母,及其距离. 题解:即求Z出发的最短路,用dijstra就可以了,注意边要开到20000以上. /* TASK: comehome LA ...

  2. 使用jquery脚本获取随笔、文章和评论的统计数,自定义显示位置

    为了这个问题,花了好些时间去摸索,无奈没有搞定.于是,我就到博问去提问,终于搞定! 在此,非常感谢SeayXu的热心帮助. 1.在需要的位置添加一个标签 <div id="stats_ ...

  3. 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 444[Submit][Status][Discuss] D ...

  4. HttpClient 4.3 使用

    httpclient的api变化很快,本篇随笔记录自己使用4.3.6版本时所做的设置.版本虽然不是最新,但达到了目的就行. maven依赖: <dependency> <groupI ...

  5. RabbitMQ 消息确认机制

    消息确认机制 在之前异常处理部分就已经写了,对于consumer的异常退出导致消息丢失,可以时候consumer的消息确认机制.重复的就不说了,这里说一些不一样的. consumer的消息确认机制 当 ...

  6. Iptables防火墙NAT地址转换与端口转发

    开启系统转发功能: [root@localhost /]# vim /etc/sysctl.conf # Generated by iptables-save v1.4.7 on Thu May 12 ...

  7. Log4net中换行符

    在log4net节点中 <appender name="DebugLogFileAppender" type="log4net.Appender.FileAppen ...

  8. 【Linux】使用update-alternatives命令进行版本的切换

    引言 在Redhat中也有此功能,用于切换不同版本. 在Debian系统中,我们可能会同时安装有很多功能类似的程序和可选配置,可能会出现同一软件的多个版本并存的场景.比如像是一些编程语言工具,一些系统 ...

  9. 程序代码中退出函数exit()与返回函数return ()的区别

    程序代码中退出函数exit()与返回函数return ()的区别   exit(0):正常运行程序并退出程序:   exit(1):非正常运行导致退出程序:   return():返回函数,若在主函数 ...

  10. BCP导出导入大容量数据实践

    前言 SQL SERVER提供多种不同的数据导出导入的工具,也可以编写SQL脚本,使用存储过程,生成所需的数据文件,甚至可以生成包含SQL语句和数据的脚本文件.各有优缺点,以适用不同的需求.下面介绍大 ...