python計算文件md5值


  md5是一種常見不可逆加密算法,使用簡單,計算速度快,在很多場景下都會用到,比如:給用戶上傳的文件命名,數據庫中保存的用戶密碼,下載文件后檢驗文件是否正確等。下面講解在python中如何使用md5算法。

 

一、計算字符串的md5值

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import hashlib

reload(sys)
sys.setdefaultencoding('utf-8')

if __name__ == '__main__':
    content = "hello"
    md5hash = hashlib.md5(content)
    md5 = md5hash.hexdigest()
    print(md5)

 運行上述代碼,輸出:5d41402abc4b2a76b9719d911017c592

用PHP自帶的md5函數計算同一個字符串,驗證下hello的md5是否正確。

<?php

    $content = "hello";
    $md5 = md5($content);
    var_dump($md5);    // 輸出 5d41402abc4b2a76b9719d911017c592

可見python下計算字符串的md5也是非常方便,使用hashlib庫即可。網上有文章介紹python2.x下可以使用md5庫,該庫在python3.x不能使用,因此不推薦使用該庫。

 

字符串的md5計算比較簡單,下面看下如何計算文件的md5值。

二、計算文件的md5值

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import hashlib

reload(sys)
sys.setdefaultencoding('utf-8')

if __name__ == '__main__':
    file_name = "3383430480_51_01.jpg"
    with open(file_name, 'rb') as fp:
        data = fp.read()
    file_md5= hashlib.md5(data).hexdigest()
    print(file_md5)     # ac3ee699961c58ef80a78c2434efe0d0

文件md5計算跟字符串計算是一樣,直接使用hashlib的md5方法,然后hexdigests就好了。同樣用PHP代碼驗證下

<?php

    $file_name = "3383430480_51_01.jpg";
    $file_md5 = md5_file($file_name);
    var_dump($file_md5);    // 輸出 ac3ee699961c58ef80a78c2434efe0d0

從結果可以看出md5是一樣的,文件md5值也不過如此呀,心里竊喜。。。

如果大文件呢,比如幾個G呢,上述代碼肯定會內存溢出,怎么辦呢,可以分塊讀取文件內容並計算。

 

三、計算大文件的md5值

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import hashlib

def get_file_md5(fname):
    m = hashlib.md5()   #創建md5對象
    with open(fname,'rb') as fobj:
        while True:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)  #更新md5對象

    return m.hexdigest()    #返回md5對象

reload(sys)
sys.setdefaultencoding('utf-8')

if __name__ == '__main__':
    file_name = "mongodb_us.zip"
    file_md5 = get_file_md5(file_name)
    print(file_md5)     # 0f45cdbf14de54001e82a17c3d199a4b

分塊讀取文件內容,然后調用hashlib的update()方法將分塊數據更新至md5對象中,最后調用hexdigest()方法得出md5值。

 

四、封裝成常用庫md5.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import hashlib

def get_file_md5(file_name):
    """
    計算文件的md5
    :param file_name:
    :return:
    """
    m = hashlib.md5()   #創建md5對象
    with open(file_name,'rb') as fobj:
        while True:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)  #更新md5對象

    return m.hexdigest()    #返回md5對象


def get_str_md5(content):
    """
    計算字符串md5
    :param content:
    :return:
    """
    m = hashlib.md5(content) #創建md5對象
    return m.hexdigest()

 

好了,關於md5的計算就到這里,有不同見解的同學,歡迎拍磚,一起來探討,謝謝。

 


免責聲明!

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



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