4、hashlib

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示。

摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

hash算法就像一座工厂,工厂接收你送来的原材料(可以用m.update()为工厂运送原材料),经过加工返回的产品就是hash值

MD5

from base64 import encode
import hashlib

# 哈希工厂
md5 = hashlib.md5()

# 运送原材料(源数据),update方法内必须传bytes
md5.update('how to use md5 in python hashlib?'.encode('utf8'))

# 生成哈希值
print(md5.hexdigest())

'''
d26a53750bc40b38b65a520292f69306
'''

加盐

加盐:额外给原始数据添加一点自定义的数据,使得生成的消息摘要不同于普通方式计算的摘要。

from base64 import encode
import hashlib

# 哈希工厂
md5 = hashlib.md5()

# 运送原材料(源数据),update方法内必须传bytes
md5.update('how to use md5 in python hashlib?'.encode('utf8'))

#加盐,盐值:yhgh
md5.update('yhgh'.encode('utf8'))

# 生成哈希值
print(md5.hexdigest())

'''
e440ce3b2c8aee626688775985901e95
'''

验证文件一致性

通过两个文件的hash值,可以判断文件是否一致

import hashlib

def getFileHash(path):
    "获取文件的hash值"
    with open(path,'rb') as f:
        md5 = hashlib.md5()
        md5.update(f.read())
        return md5.hexdigest()

h1 = getFileHash("./1.txt")
h2 = getFileHash("./2.txt")
print(h1 == h2)