hashlib

# 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

 

posted @ 2024-11-18 21:25  尐少  阅读(2)  评论(0编辑  收藏  举报