• 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加密代码

     1 # coding=gbk
     2 
     3 import hashlib
     4 import os
     5 import datetime
     6 
     7 def GetFileMd5(filename):
     8     if not os.path.isfile(filename):
     9         return
    10     myhash = hashlib.md5()
    11     f = open(filename,'rb')
    12     while True:
    13         b = f.read(8096)
    14         if not b :
    15             break
    16         myhash.update(b)
    17     f.close()
    18     return myhash.hexdigest()
    19 
    20 filepath = raw_input('请输入文件路径:')
    21 
    22 # 输出文件的md5值以及记录运行时间
    23 starttime = datetime.datetime.now()
    24 print GetFileMd5(filepath)
    25 endtime = datetime.datetime.now()
    26 print '运行时间:%ds'%((endtime-starttime).seconds)

    参考资料

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

    python检测文件的MD5值

    原创声明

    Freecode# : www.cnblogs.com/yym2013

  • 相关阅读:
    通配符^与not like 区别
    SQL语句
    身份证的性别验证(摘抄)
    基于VirtualBox虚拟机安装Ubuntu教程
    VMware手动添加centos7硬盘图文操作及分区超详细
    acl权限命令
    linux查看分区是否开启acl权限
    CentOS7上Docker简单安装及nginx部署
    Docker安装ngnix使用ping报错
    centos7安装mysql5.6
  • 原文地址:https://www.cnblogs.com/yym2013/p/5482796.html
Copyright © 2020-2023  润新知