1、uuid模块
uuid:是128为全局唯一标识符,通常由32字节的字母串表示,它可以保证时间和空间的唯一性,也称为GUID
原理:通过mac地址、时间戳、命令空间、随机数、伪随机数来保证生产的ID的唯一性
【作用】
随机生成字符,当成token使用,当成订单号、用户账号等
【算法】
(1)uuid1()基于时间戳:有mac地址,当前的时间戳,随机数,可以保证全球范围内的唯一性。但是由于mac地址使用带来的安全性,局域网中可以使用ip地址来替代。
(2)uuid2()基于分布式计算环境DCE:
算法和uuid1()相同,不同是把时间戳的前四位换位posix的uid,实际中很少使用,python中没有这个函数
(3)uuid3()基于基于名字和md5散列值:比较常用
通过计算名字和命令空间的md5散列值得到的,保证了同一命令空间中不同名字的唯一性,和不同命令空间的唯一性。
但是同一命名空间的相同名字生成相同的uuid
(4)uuid14()基于随机数:
它是有伪随机数得到的,有一定重复概率,这个概率并且是可以计算出来的
(5)uuid1()基于名字和SAH1的散列值:比较常用
算法原理和uuid3()算法原理相同,不同的是使用sha1算法
import uuid
# print(uuid.uuid1()) # d6647d94-a39d-11e9-8258-98fa9b100544
print(uuid.uuid4())
print(uuid.uuid3(namespace=uuid.NAMESPACE_DNS, name="wzy")) # b234f592-cece-382b-bccb-ae56c8fb0bb8
print(uuid.uuid5(namespace=uuid.NAMESPACE_DNS, name="wzy")) # 43c98da6-920f-570d-a2e8-08f890b4340c
2、base64模块
base64是一种比较常见的二进制编码方式。
【原理】:一个包含64个字符的数组
['A','B',....,'a','b',.....,'0','1',.....,'+','/']
对二进制数据进行处理,每三个字节一组,一组就是3x8=24bit,划为4组,每组正好64bit
【作用】
适用于小段内容的编码,比如数字证书签名,cookie,网页中传输的少量二进制数据。需要注意的是base64是一种通过查表的编码方法,不能用于加密,及时修改了字符对照表也不行。
import base64
s = b'jun is good man'
# 编码
print(base64.b64encode(s)) # b'anVuIGlzIGdvb2QgbWFu'
print(base64.b64encode("jun is good man".encode("utf-8"))) # b'anVuIGlzIGdvb2QgbWFu'
# 解码
s2= b'anVuIGlzIGdvb2QgbWFu'
print(base64.b64decode(s2)) # b'jun is good man'
3、hashlib模块
import hashlib
str_char = b"wanzhuang2019"
m5 = hashlib.md5()
m5.update(str_char)
print(m5.hexdigest()) # c73ac3cb6e162d37d7ca05395f797426
# 如果数据量比较大,可以分多次调用update,最后结果是一样的
m6 = hashlib.md5()
m6.update(b'wanzhuang')
m6.update(b'2019')
print(m6.hexdigest()) # c73ac3cb6e162d37d7ca05395f797426
import requests
import hashlib
# hash算法,对某段信息打印指纹,能够压缩信息,hash算法不可逆
chunkSize= 4096 # 每次读取文件的字节数
def hashFile(file_name):
"""对文件做hash"""
h = hashlib.sha256()
while True:
with open(file_name, "rb") as f:
chunk = f.read(chunkSize)
if not chunk: # 表示文件没有内容可读取了
break
h.update(chunk)
return h.hexdigest() # 得到文件最终hash值
def hashStr(str):
"""对某个字符串进行hash值,str是需要被hash的字符串"""
h = hashlib.sha256()
h.update((str).encode("utf-8"))
return h.hexdigest()
def info(object):
methodList = [method for method in dir(object) if callable(getattr(object,method))]
print(methodList)
if __name__ == '__main__':
info(requests)
4、hmac模块
hmac:实现HMAC算法,是用一个key对数据进行“杂凑”后再进行hash算法,使用hmac比hash算法更安全。因为不同key会产生不同的hash
import hmac
char_str = b'wzy2003'
key = b'xiaomi'
h = hmac.new(key,char_str,digestmod="MD5")
print(h.hexdigest()) # 71b24094b7584dcc478e9cacdbd884ea
5、md5模块
对普通数据md5
import hashlib
def get_string_md5():
info = "xiaozhu"
m = hashlib.md5()
m.update(info.encode("utf-8"))
return m.hexdigest()
下面是对一个文件内容进行md5,比如我们在传输过程中判断文件是否出现问题
import hashlib
def get_file_md5(fname:str)-> str:
"""
:param fname: 文件名称
:return:
"""
hash_md5 = hashlib.md5()
with open(fname,"rb") as f:
for chunk in iter(lambda :f.read(4096),b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
if __name__ == '__main__':
m_value = get_file_md5(r"D:\迅雷下载\odoo_13.0.20191002 - 副本.exe")
print(m_value) #02ffe90c7100bb9a88f6d98bf71a6e91