Python进阶篇:9 内置模块uuid/base64/hashlib/hmac/md5

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值