• 28 hashlib 模块 logging 模块 和 configparser模块 functools模块的偏函数partial


    
    

    主要内容:

    1 . hashlib 模块 : 摘要算法的模块

      定义: 能够把一个字符串数据类型的变量转换成一个定长的密文的字符串,字符串里的每一个字符都是一个十六进制数字.

      算法 : 对于同一个字符串,用相同的算法,相同的手段去进行摘要获得的值总是相同的.

      a : md5 是一个算法, 32位的字符串 ,每个字符串都是一个十六进制.(效率高,算法相对简单)

    import hashlib
    s = 'lilv'
    md5_obj = hashlib.md5()
    md5_obj.update(s.encode('utf-8'))
    re1 = md5_obj.hexdigest()
    print(re1)
    

      b: sha1算法: 40位的字符串 , 每一个字符都是一个16进制.算法相对复杂,计算速度也慢.

    md5_obj = hashlib.sha1()
    md5_obj.update(s1.encode('utf-8'))
    res = md5_obj.hexdigest()
    print(res,len(res),type(res))
    

      c : 校验问题

      文件的一致性校验:

    md5_obj = hashlib.md5()
    with open('5.序列化模块_shelve.py','rb') as f:
        md5_obj.update(f.read())
        ret1 = md5_obj.hexdigest()
    
    md5_obj = hashlib.md5()
    with open('5.序列化模块_shelve.py.bak','rb') as f:
        md5_obj.update(f.read())
        ret2 = md5_obj.hexdigest()
    print(ret1,ret2)
    

     d: MD5算法

    登录的密文验证

    字符串 --> 密文 , ,密文与字符串之间是不可逆的.

    lily --->aee949757a2e698417463d47acac93df

    s1 = '123456'
    md5_obj = hashlib.md5()
    md5_obj.update(s1.encode('utf-8'))
    res = md5_obj.hexdigest()
    print(res,len(res),type(res))

    会出现数据库撞库的现象.黑客可以根据反推的方式推测出用户的密码,所以引入了加任意的盐.

    加盐  # alex3714  d3cefe8cdd566977ec41566f1f11abd9
    md5_obj = hashlib.md5('任意的字符串作为盐'.encode('utf-8'))
    md5_obj.update(s1.encode('utf-8'))
    res = md5_obj.hexdigest()
    print(res,len(res),type(res))
    

    动态加盐的方式,即每个用户的一个属性作为盐,那么想要破解密码,每个用户都需要用一个库去比较,大大增加了破解所有账户的难度。

    username = input('username : ')
    passwd = input('password : ')
    md5obj = hashlib.md5(username.encode('utf-8'))
    md5obj.update(passwd.encode('utf-8'))
    print(md5obj.hexdigest())
    

    2. configparser模块

    3. logginng模块

      a : 功能 :日志格式的规范   ;  操作的简化 ;  日志的分级管理

      b: 不能帮你做的事情 :自动生成你要打印的内容; 在哪些地方需要打印,要打印的内容是什么,内容的级别.

      c : logging模块的使用 : 普通配置型  简单的 可定制性差

                 对象配置型  复杂的 可定制性强

      d : 认识日志的分级:    默认打印123个

    import logging
    logging.debug('debug message')      # 调试模式     5
    logging.info('info message')        # 基础信息     4
    logging.warning('warning message')  # 警告         3
    logging.error('error message')      # 错误         2
    logging.critical('critical message')# 严重错误    1
    

        加了一个参数: leval = DEBUG全部显示.(可以输出屏幕)

    import logging
    logging.basicConfig(level=logging.DEBUG)
    logging.debug('debug message')      # 调试模式
    logging.info('info message')        # 基础信息
    logging.warning('warning message')  # 警告
    logging.error('error message')      # 错误
    logging.critical('critical message')# 严重错误
    

        写入文件

    import logging
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                        datefmt='%a, %d %b %Y %H:%M:%S',
                        filename='test.log')
    logging.debug('debug message')      # 调试模式
    logging.info('info message')        # 基础信息
    logging.warning('warning message')  # 警告
    logging.error('error message')      # 错误
    logging.critical('critical message')# 严重错误
    

      e : basicConfig:不能将一个log信息既输出到屏幕 又输出到文件logger对象的形式来操作日志文件  

    import logging
    # 创建一个logger对象
    logger = logging.getLogger()
    # 创建一个文件管理操作符
    fh = logging.FileHandler('logger.log',encoding='utf-8')
    # 创建一个屏幕管理操作符
    sh = logging.StreamHandler()
    # 创建一个日志输出的格式
    format1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
    # 文件管理操作符 绑定一个 格式
    fh.setFormatter(format1)
    # 屏幕管理操作符 绑定一个 格式
    sh.setFormatter(format1)
    logger.setLevel(logging.DEBUG)
    # logger对象 绑定 文件管理操作符
    logger.addHandler(fh)
    # logger对象 绑定 屏幕管理操作符
    logger.addHandler(sh)
    

    4 functools 模块

      偏函数partial

      偏函数: 制定一个默认参数, 包装成另外一个参数. 

    print(int("10000", base=2))
    print(int("1000", base=2))
    print(int("100", base=2))
    print(int("10", base=2))
    # 可以写成下面的格式
    int2 = partial(int, base=2)
    print(int2("10000"))
    print(int2("1000"))
    print(int2("100"))
    print(int2("10"))
    

      

      

  • 相关阅读:
    fork 入门
    java 注解 @Retention @interface 元数据
    JAVA泛型简析
    http数据流 gzip解压方法分析
    gdb调试提示 Missing separate debuginfos
    Vue2.x响应式原理
    观察者模式
    优秀博客收集
    切换npm源的方式
    前端模块化之ES Module
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9452023.html
Copyright © 2020-2023  润新知