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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章