python計算文件的md5值

前言

  最近要開發一個基於python的合併文件夾/目錄的程序,原本的想法是基於修改時間的比較,即判斷文件有沒有改變,比較兩個文件的修改時間便可。這個想法在windows的pc端下測試沒有問題。php

  可是當把一個文件從pc端複製到優盤時出現了一個問題,複製到優盤的文件比pc端的文件慢了兩秒鐘html

  這裏我用的複製函數是 shutil.copy2(),理論上它會把修改時間和最後訪問時間也複製過來1,可是實際狀況並非徹底相同。python

  詳細狀況我在segmentfault裏提出了問題:爲何將一個文件從pc中複製到優盤中修改時間會慢2秒鐘?算法

  看shutil.copy2的資料和網上的解答,發現多是文件系統的差異形成的,windows的pc端文件系統是ntfs,優盤的是fat32。但仍是想了解更深層的緣由,但願知道的大神解答一下。segmentfault

  扯遠了,基於以上問題的出現,迫使我得修改比較策略,因而我找到了用文件的MD5值比較的方法,yeah!~windows

  具體來講,每一個文件都會有一個MD5的加密值,這個值來惟一標識這個文件(百度雲的快速上傳/秒傳就是基於這個道理),它經常使用來辨別文件的真僞,例以下載系統安裝鏡像,旁邊會附帶一個長長的字符亂碼,這就是這個鏡像的MD5值。函數

  文件被修改後其MD5值也會改變,因此能夠用來判斷一個文件是否被修改過。post

  這樣的方法比基於時間的比較顯然更加可靠,如今惟一的問題就是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

相關文章
相關標籤/搜索