Python计算文件MD5值:从字符串到分块读取大文件
本文详解如何使用Python计算MD5值。首先介绍利用hashlib库计算字符串MD5的方法,并通过PHP代码验证结果一致性。接着针对大文件可能导致的内存溢出问题,演示分块读取并更新MD5对象的解决方案,最后封装为常用工具库,提供字符串与文件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。
为了验证字符串"hello"的MD5计算是否正确,可以使用PHP内置的md5函数进行交叉验证。
<?php
$content = "hello";
$md5 = md5($content);
var_dump($md5); // 输出 5d41402abc4b2a76b9719d911017c592
二、计算文件的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方法并获取hexdigest即可。此处同样使用PHP代码进行结果比对验证。
<?php
$file_name = "3383430480_51_01.jpg";
$file_md5 = md5_file($file_name);
var_dump($file_md5); // 输出 ac3ee699961c58ef80a78c2434efe0d0
对比结果显示,Python与PHP计算出的文件MD5值完全一致,文件MD5的计算过程相对直观。
然而,若处理体积较大的文件(例如几个GB),上述一次性读取所有内容的代码会导致内存溢出。针对此问题,可采用分块读取文件内容并逐步计算MD5的方法。
三、计算大文件的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
四、封装成常用库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计算的讲解至此结束。欢迎有不同见解的读者提出批评与建议,共同交流探讨,谢谢。
以上是用Python计算文件MD5值的详细内容,更多Python计算文件MD5的相关资料请持续关注本站其他技术文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









