Python之第二十七天的努力--pickle、hashlib模块

2021-04-29 12:27

阅读:466

标签:odi   内容   ==   步骤   pass   模块   方法   range   c中   

01 pickle模块:一次性写入,一次性读取

  1. 序列化

‘‘‘
pickle:
将Python中所有的数据类型。转换成字节串,序列化过程
将字节串转换成Python中数据类型,反序列化过程。
‘‘‘


import pickle

# 所有的数据类型都可以进行序列化
# bys = pickle.dumps([1, 2, 3])
# print(type(bys))                # 
# 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))                # 

#
# bys = pickle.dumps(set(‘abc‘))
# res = pickle.loads(bys)
# print(type(res))                    # 
  1. 把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))                # 
    print(res)                      # [1, 2, 3]
  1. 对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模块

  1. 封装一些用于加密的类。

    md5()....

  2. 加密的目的:用于判断和验证,而并非解密。

  3. 特点:

    • 把一个大的数据,切分成不同快,分别对不同的快进行加密,再进行汇总的结果,和直接对整体数据加密的结果是一致的。
    • 单项加密,不可逆。
    • 原始数据的一点小的变化,将导致结果的非常大的差异,‘雪崩’效应。
  4. 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‘
    
    
    # 给一个数据加密。
    # 验证:用另一个数据加密的结果和第一次加密的结果对比。
    # 如果结果相同,说明原文相同。如果不相同,说明原文不同。
    
  5. 不同加密算法的区别

    # 不同加密算法:实际上就是加密结果的长度不同;
    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
    
  6. 其他

    # 创建加密对象时,可以指定参数,称为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
    
  7. 练习

    # 练习:
    # 登录注册程序
    
    
    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()
    

Python之第二十七天的努力--pickle、hashlib模块

标签:odi   内容   ==   步骤   pass   模块   方法   range   c中   

原文地址:https://www.cnblogs.com/szheng/p/13232867.html


评论


亲,登录后才可以留言!