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 = ad(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 = ad(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对象
python怎么读取py文件return m.hexdigest()
好了,关于md5的计算就到这⾥,有不同见解的同学,欢迎拍砖,⼀起来探讨,谢谢。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。