# hash # hash() 將資料轉換成一個數字的演算法 """在同一次執行過程中,對同一個可hash的值進行計算得到的值是相同的,類似記憶體地址""" print(hash('123')) # 6690882297275263703 print(hash("123")) # 6690882297275263703 a = '123' b = '123' print(hash(a)) # 6690882297275263703 print(hash(b))# 6690882297275263703 a、b hash值相同 import hashlib # hashlib """ 1、提供多種演算法: 相同資料用相同演算法計算結果相同: hashlib.md5() 可被撞庫、暴力破解,定長32位16進位制 hashlib.sha1() sha演算法集數字越大計算量越大,越安全 2、只能加密,不可逆進行解密; 3、演算法傳參只能接受bytes型別; """ md5_obj1 = hashlib.md5() md5_obj1.update(b'abc') # 注意傳參是bytes型別 print(md5_obj1.hexdigest()) # 900150983cd24fb0d6963f7d28e17f72 md5_obj2 = hashlib.md5('key'.encode('utf8') # 加鹽,字串可以是任意簽名 md5_obj2.update(b'abc') print(md5_obj2.hexdigest()) # 52878f125814206651a24111280ec873 # 示例 def login(u_name, u_pwd): key = u_name # 動態加鹽,提高安全性 md5_pwd = hashlib.md5(key.encode('utf8)) md5_pwd.update(u_pwd) md5_pwd_str = md5_pwd.hexigest() with open('user_info.txt') as f: for line in f: name, pwd = line.split(',') if name.strip() == u_name and pwd.strip() == md5_pwd_str: print('登入成功') break login('王五', 'abc') #對比檔案md5值,可用於校驗檔案一致性 def calculate_hash(file_path): with open(file_path) as f: md5_obj3 = hashlib.md5() file_size = os.path.getsize(file_path) while file_size > 0: context = f.read(1024) # 大檔案分批讀取 md5_obj3.update(context.encode('utf8')) # hashlib.md5 支援多段資料更新 file_size -= 1024 return md5_obj3.hexdigest() # 檔案的hash值改變說明檔案有改動 f1 = 'user_info.txt' print(calculate_hash(f1))
user_info.txt
張三,52878f125814206651a24111280ec873
李四,52878f125814206651a24111280ec873
王五,f8e8f25285b9f61b56bdf7bd5c2c8f9f