Python之第二十七天的努力--pickle、hashlib模块
时间:2020-07-03 22:59:22
收藏:0
阅读:58
01 pickle模块:一次性写入,一次性读取
-
序列化
‘‘‘
pickle:
将Python中所有的数据类型。转换成字节串,序列化过程
将字节串转换成Python中数据类型,反序列化过程。
‘‘‘
import pickle
# 所有的数据类型都可以进行序列化
# bys = pickle.dumps([1, 2, 3])
# print(type(bys)) # <class ‘bytes‘>
# print(bys) # b‘\x80\x03]q\x00(K\x01K\x02K\x03e.‘
#
# bys = pickle.dumps((1,2,3))
# print(bys) # b‘\x80\x03K\x01K\x02K\x03\x87q\x00.‘
#
# res = pickle.loads(bys)
# print(type(res)) # <class ‘tuple‘>
#
# bys = pickle.dumps(set(‘abc‘))
# res = pickle.loads(bys)
# print(type(res)) # <class ‘set‘>
-
把pickle序列化内容写入文件中
# 把pickle序列化内容写入文件中
with open(‘c.txt‘,mode=‘wb‘) as f:
pickle.dump([1,2,3],f)
# 从文件中反序列化pickle数据
with open(‘c.txt‘,mode=‘rb‘) as f1:
res = pickle.load(f1)
print(type(res)) # <class ‘list‘>
print(res) # [1, 2, 3]
-
对pickle数据多次操作
# 多次把pickle数据写入到同一文件中 with open(‘c.txt‘,mode=‘ab‘) as f: pickle.dump([1,2,3],f) pickle.dump([1,2,3],f) pickle.dump([1,2,3],f) # 从文件中反序列化pickle数据 with open(‘c.txt‘,mode=‘rb‘) as f1: for x in range(4): res = pickle.load(f1) print(res)
02 json与pickle比较
# json与pickle比较:
‘‘‘
json:
1.不是所有的数据类型都可以序列化。
2.不能多次对同一文件序列化。
3.json数据可以跨语言
pickle:
1.所有的Python类型都能序列化,结果为 字符 串。
2.可以多次对同一文件序列化。
3.不能跨语言。
‘‘‘
03 hashlib模块
-
封装一些用于加密的类。
md5()....
-
加密的目的:用于判断和验证,而并非解密。
-
特点:
- 把一个大的数据,切分成不同快,分别对不同的快进行加密,再进行汇总的结果,和直接对整体数据加密的结果是一致的。
- 单项加密,不可逆。
- 原始数据的一点小的变化,将导致结果的非常大的差异,‘雪崩’效应。
-
md5加密算法
‘‘‘ md5加密算法: 给一个数据加密的三大步骤: 1.获取一个加密对象。 2.使用加密对象的update,进行加密,update方法可以调用多次 3.通常通过hexdigest获取加密结果,或digest()方法。 ‘‘‘ import hashlib # 获取一个加密对象 m = hashlib.md5() # 使用加密对象的update,进行加密 # m.update(b‘abc‘) m.update(‘abc中文‘.encode(‘utf-8‘)) # 通过hexdigest获取加密结果 res = m.hexdigest() print(res) # 1af98e0571f7a24468a85f91b908d335 # res = m.digest() # print(res) # b‘\x1a\xf9\x8e\x05q\xf7\xa2Dh\xa8_\x91\xb9\x08\xd35‘ # 给一个数据加密。 # 验证:用另一个数据加密的结果和第一次加密的结果对比。 # 如果结果相同,说明原文相同。如果不相同,说明原文不同。
-
不同加密算法的区别
# 不同加密算法:实际上就是加密结果的长度不同; s = hashlib.sha224() s.update(b‘abc‘) print(s.hexdigest()) # 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 print(len(hashlib.md5().hexdigest())) # 32 print(len(hashlib.sha224().hexdigest())) # 56 56*4=224 print(len(hashlib.sha256().hexdigest())) # 64 64*4=256
-
其他
# 创建加密对象时,可以指定参数,称为salt。 m = hashlib.md5(b‘abc‘) print(m.hexdigest()) # 900150983cd24fb0d6963f7d28e17f72 m = hashlib.md5() m.update(b‘abc‘) print(m.hexdigest()) # 900150983cd24fb0d6963f7d28e17f72
# 拆分成不同小块 m = hashlib.md5() m.update(b‘abcdef‘) # e80b5017098950fc58aad83c8c14978e print(m.hexdigest()) m = hashlib.md5() m.update(b‘abc‘) m.update(b‘def‘) print(m.hexdigest()) # e80b5017098950fc58aad83c8c14978e
-
练习
# 练习: # 登录注册程序 def get_md5(username,password): m = hashlib.md5() m.update(username.encode(‘utf-8‘)) m.update(password.encode(‘utf-8‘)) return m.hexdigest() def register(username,password): # 加密 res = get_md5(username,password) # 写入文件 with open(‘login‘,mode=‘at‘,encoding=‘utf-8‘) as f: f.write(res) f.write(‘\n‘) def login(username,password): # 获取当前登录信息的加密结果 res = get_md5(username, password) # 读文件,和其他的数据进行对比 with open(‘login‘,mode=‘rt‘,encoding=‘utf-8‘) as f: for line in f: if res == line.strip(): return True else: return False def main(): while 1: op = int(input(‘1.注册 2.登录 3.退出‘)) if op == 1: username = input(‘输入用户名:‘) password = input(‘输入密码:‘) register(username,password) elif op == 2: username = input(‘输入用户名:‘) password = input(‘输入密码:‘) res = login(username,password) if res: print(‘登录成功‘) else: print(‘登录失败‘) elif op == 3: break if __name__ == ‘__main__‘: main()
评论(0)