# 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('登录成功')breaklogin('王五', '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 -= 1024return md5_obj3.hexdigest() # 文件的hash值改变说明文件有改动 f1 = 'user_info.txt' print(calculate_hash(f1))
user_info.txt
张三,52878f125814206651a24111280ec873
李四,52878f125814206651a24111280ec873
王五,f8e8f25285b9f61b56bdf7bd5c2c8f9f