前言

  最近要开发一个基于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. 计算文件的MD5值(Java &amp; Rust)

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

  6. python 计算文件md5值

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

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

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

  8. 计算指定文件的MD5值

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

  9. c# 计算字符串和文件的MD5值的方法

    快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中.   <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...

随机推荐

  1. 【HanLP】HanLP中文自然语言处理工具实例演练

    HanLP中文自然语言处理工具实例演练 作者:白宁超 2016年11月25日13:45:13 摘要:HanLP是hankcs个人完成一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环 ...

  2. VXLAN 概念(Part I) - 每天5分钟玩转 OpenStack(108)

    除了前面讨论的 local, flat, vlan 这几类网络,OpenStack 还支持 vxlan 和 gre 这两种 overlay network. overlay network 是指建立在 ...

  3. js中的preventDefault与stopPropagation详解

    本篇文章主要是对js中的preventDefault与stopPropagation进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 首先讲解一下js中preventDefault和stopP ...

  4. poj 2509 Peter&#39;s smokes

    http://poj.org/problem?id=2509 Peter's smokes Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  5. mysql概要(十一)存储引擎

    1.数据库对同样的数据可以不同的方式存储和管理,每种方式对应一种引擎. 1.1定义: 2.引擎种类的特点:

  6. C#的一个异常

    1.catch捕获得到的异常如图 2.解决办法(找到app.config文件,修改图中的值将原来的8192扩大了10倍)

  7. Python爬虫 正则表达式

    1.正则表达式概述 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来 ...

  8. 一起来学linux:用户与用户组

    linux的文件属性以及管理方法和windows是完全不同的,所以学习linux首先来了解下用户以及文件权限是怎么回事 p { margin-bottom: 0.25cm; line-height: ...

  9. iOS js oc相互调用(JavaScriptCore 下)

    下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的block 上代码 -(void)we ...

  10. memcached源码剖析——流程图

    参考: http://blog.csdn.net/column/details/memcached-src.html http://calixwu.com/2014/11/memcached-yuan ...