Python计算文件MD5值:从字符串到分块读取大文件

苏见山
苏见山
发布时间:2026-10-15 | 5人浏览过
原创

本文详解如何使用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的相关资料请持续关注本站其他技术文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表