利用Python計算文件MD5值(從前台上傳一個文件,后台計算MD5值后,返給前端)
注意題目要求:從前台上傳一個文件,后台計算MD5值后,返給前端,這就需要我們再引入一個os模塊實現輸入功能。
首先介紹一下md5值是什么,MD5的全稱是Message-Digest Algorithm 5.在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明.經MD2.MD3和MD4發展而來. Message-Digest泛指字節串(Message)的Hash變換.就是把一個任意長度的字節串變換成一定長的大整數.請注意我使用了[字節串"而不是[字符串"這個詞.是因為這種變換只與字節的值有關.與字符集或編碼方式無關. MD5將任意長度的[字節串"變換成一個128bit的大整數.並且它是一個不可逆的字符串變換算法.換句話說就是.即使你看到源程序和算法描述.也無法將一個MD5的值變換回原始的字符串MD5還廣泛用於加密和解密技術上.
在很多操作系統中.用戶的密碼是以MD5值(或類似的其它算法)的方式保存的. 用戶Login的時候.系統是把用戶輸入的密碼計算成MD5值.然后再去和系統中保存的MD5值進行比較.而系統並不[知道"用戶的密碼是什么.MD5在論壇上.軟件發布時經常用.是為了保證文件的正確性.防止一些人盜用程序.
為了計算文件的md5值我們引入python的hashlib模塊
#coding=utf-8 import hashlib import os #Python os模塊包含普遍的操作系統功能。如果你希望你的程序能夠與平台無關的話,這個模塊是尤為重要的。 _FILE_SLIM=100*1024*1024 def File_md5(filename): calltimes = 0 #分片的個數 hmd5 = hashlib.md5() fp = open(filename, "rb") f_size = os.stat(filename).st_size #得到文件的大小 if f_size > _FILE_SLIM: while (f_size > _FILE_SLIM): hmd5.update(fp.read(_FILE_SLIM)) f_size /= _FILE_SLIM calltimes += 1 # delete #文件大於100M時進行分片處理 if (f_size > 0) and (f_size <= _FILE_SLIM): hmd5.update(fp.read()) else: hmd5.update(fp.read()) return (hmd5.hexdigest(), calltimes) filepath = raw_input('請輸入文件路徑: ') print File_md5(filepath)
在計算文件的md5值時,遇到大文件(假設大於100M)時,不能簡單的一次載入內存,需要對文件分片不斷的update完成(需要分片)
Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。
分片的簡單例子:
import hashlib</span> md5 = hashlib.md5() md5.update('how to use md5 in python hashlib?') print md5.hexdigest()
分片:
md5 = hashlib.md5() md5.update('how to use md5 in ') md5.update('python hashlib?') print md5.hexdigest()
md5的使用:
mymd5=hashlib.md5() #產生一個新的md5類型對象mymd5 mymd5.update() #用傳入參數改變mymd5對象,返回傳如參數的md5值
如果m.update(a)之后在 m.update(b),那么就相當於m.update(a+b)
md5.hexhashlib() #返回一個十六進制的32位md5值
input()函數支持用戶輸入數字或者表達式,不支持輸入字符串.返回的是數字類型的數值.
raw_input()函數捕獲的是用戶的原始輸入,返回為字符串.