• 2018.10.18学习总结


    1"""
    hash lib
    hash是一种算法 是将一个任意长的数据 根据计算 得到一个固定长度特征码
    特征: 不同输入 可能会有相同的结果 几率特别小
    相同的输入 必然得到相同结果
    由于散列(特征)的性质 从原理来看是不可能 反解

    用来 验证 两个输入的数据是否一致
    使用场景
    1.密码验证
    123321 jahsajshajhsjahjas

    client 加密后结果 server 拿到加密后

    2.验证数据是否被篡改 比如游戏安装包 有没有被改过


    为了防止别人撞库成功 可用提升密码的复杂度 其次可以为密码加盐 (加点内容进去)
    """


    import hashlib

    m = hashlib.md5("aaa".encode("utf-8"))
    print(len(m.hexdigest()))

    # 撞库破解的原理 有人事先 把常见的 明文和密文的对应关系 存到了数据库中
    # 运气好就能查询到
    pwds = {"aaa":"47bce5c74f589f4867dbd57e9ca9f808"}


    h1 = hashlib.sha512("123".encode("utf-8"))
    h2 = hashlib.sha3_512("123".encode("utf-8"))

    # print(len(h.hexdigest()))
    print(h1.hexdigest())
    print(h2.hexdigest())

    # 2b70683ef3fa64572aa50775acc84855

    # 加盐
    m = hashlib.md5("321".encode("utf-8"))
    #加
    m.update("abcdefplkjoujhh".encode("utf-8"))

    print(m.hexdigest())

    import hmac
    # 没啥区别 只是在创建的时候必须加盐
    h = hmac.new("abcdefjjjj".encode("utf-8"))

    h.update("123".encode("utf-8"))

    print(h.hexdigest())

    2logging模块看文件包内容
    import logging

    # 1.日志的级别
    # logging.debug("这是一个调试信息") # 10
    # logging.info("常规信息") # 20
    # logging.warning("警告信息") # 30#直接可以打印到终端不过默认级别是30
    # logging.error("错误信息") # 40
    # logging.critical("严重错误") # 50
    # 在logging模块中有对应的常量用来标识级别
    # 默认情况下 默认的级别30 WARNING 日志输出位置是控制台

    # 2.自定定义日志的配置
    # logging.basicConfig(#创造一个a.log文件
    # filename = "a.log",
    # filemode ="at",
    # level = 10,
    # format ="%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
    # datefmt="%Y-%m-%d %X %p"
    #
    # )
    # logging.debug("这又是调试信息")#会写入文件


    # 日志模块的四个核心角色
    """
    1.logger 日志生成器
    2.filter 过滤器
    3.handler 处理器
    4.formatter 格式处理器
    """

    # 1.创建一个日志生成器
    # mylog = logging.getLogger("mylog")
    # # 设置生成器级别
    # mylog.setLevel(logging.DEBUG)
    #
    # # 2.搞一个日志处理器
    # fh = logging.FileHandler("b.log",encoding="utf-8")
    #
    # # 3.搞一个格式处理器
    # fm = logging.Formatter(
    # "%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
    # datefmt="%Y-%m-%d %X %p")
    #
    # # 4.将 三个对象进行关联
    # mylog.addHandler(fh)
    # fh.setFormatter(fm)
    # 测试
    # mylog.debug("mylog 的 测试!")


    # log1 = logging.getLogger("father")
    # log2 = logging.getLogger("father.son")
    # log3 = logging.getLogger("father.son.grandson")#去掉father就找不到父集就只打印一条信息
    #
    # # 默认值True 标识 有继承关系 当子的日志产生日志时 给他父级以及父级以上都发一份
    # # 如果不需要继承关系就设置False
    # log3.propagate = False
    #
    # fh = logging.FileHandler("c.log",encoding="utf-8")

    # fm = logging.Formatter(
    # "%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
    # datefmt="%Y-%m-%d %X %p")

    # log1.addHandler(fh)
    # log2.addHandler(fh)
    # log3.addHandler(fh)

    # fh.setFormatter(fm)
    #
    # log1.warning("father log")
    # log2.warning("father.son log")
    # log3.warning("father.son.grandson log")#可以找到父级就会打印3条不然就打印一条,或者直接log3.propagate = False不继承

    # import logging.config
    # 以字典来配置日志 传入一个字典对象 就不需要在编写上面那一堆代码
    # logging.config.dictConfig()

    # 流处理器
    log1 = logging.getLogger("a")
    # 输出到文件
    fh = logging.FileHandler("c.log",encoding="utf-8")
    # d =logging.FileHandler(r"C:UsersjtyaolePycharmProjectsuntitledlogger10_25confe.log",encoding="utf-8")
    # log1.addHandler(d)

    # 输出到控制台
    # sh = logging.StreamHandler()

    # log1.addHandler(sh)
    log1.addHandler(fh)
    fm = logging.Formatter(
    "%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
    datefmt="%Y-%m-%d %X %p")
    # d.setFormatter(fm)
    # sh.setFormatter(fm)
    fh.setFormatter(fm)
    log1.warning("测试2!")

    # logger = lib.common.get_logger()
    #
    # def login():
    # logger.debug("测试 测试!")
    #
    # login()

    3"""
    re模块
    主要正则表达式相关
    什么是正则表达式 一堆带有特殊意义的符号组成式子
    它的作用 处理(匹配 查找 替换 )字符串
    1.
    在爬虫中大量使用 其实有框架帮你封装了这些复杂的正则
    2.
    在网站和手机app的注册功能中大量使用 例如判断你的邮箱地址是否正确


    """

    import re

    # ===============================单个字符匹配=========
    print(re.findall(" ","1 ")) # 匹配换行符
    print(re.findall(" ","1asasas121 ")) # 匹配制表符

    # ========================范围匹配===========
    print(re.findall("w","1aA_*")) # 匹配数字字母下划线
    print(re.findall("W","1aA_*,")) # 匹配非数字字母下划线
    print(re.findall("s"," f")) # 匹配任意空白字符
    print(re.findall("S"," f")) # 匹配任意非空白字符
    print(re.findall("d","123abc1*")) # 匹配任意数字,等价于[0-9]
    print(re.findall("D","123abc1*")) # 匹配任意非数字
    # print(re.findall("[abc]","AaBbCc")) # 匹配 a b c都行
    # print(re.findall("[^abc]","AaBbCc")) # 除了 a b c都行
    # print(re.findall("[0-9]","AaBbCc12349")) # 除了 a b c都行
    print(re.findall("[a-z]","AaBbCc12349")) # a-z 英文字母
    print(re.findall("[A-z]","AaBbC:c??2349[]")) # A-z 匹配原理 是按照ascII码表


    # =========================匹配位置======
    print(re.findall("Ad","123abc1*")) # 从字符串的开始处匹配只匹配一个没有输出空
    print(re.findall("d","123abc1*9 ")) # 从字符串的结束处匹配 注意把写在表达式的右边,只匹配一个没有输出空
    print(re.findall("d$","123abc1*9")) # 从字符串的结束处匹配 如果末尾有换行 换行不会参与匹配
    print(re.findall("^d","s1asasas121 ")) # 从字符开始匹配数字只匹配一个

  • 相关阅读:
    go语言的特殊变量 iota
    JS设计模式(三) 数据访问对象模式
    SSM之整合Redis
    JS设计模式(二) 惰性模式
    Ubuntu 安装 SQL Server
    JS设计模式(一) 单例模式
    JavaScript 面向对象编程
    SSM之框架整合
    Java实现CORS跨域请求
    数据库记录删除方式
  • 原文地址:https://www.cnblogs.com/jutao/p/9863510.html
Copyright © 2020-2023  润新知