計算文件的md5值


利用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()函數捕獲的是用戶的原始輸入,返回為字符串.

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM