zoukankan      html  css  js  c++  java
  • Python 用hashlib。md5加密算法

    廖雪峰的官方网站学习MD5加密,网址:“http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328251266d86585fc9514536a638f06b41908d44000”

    报“TypeError: Unicode-objects must be encoded before hashing”这种错误呢其实意思是在进行md5运算前,需要对数据进行编码。我运用的python版本与大佬的版本不符导致我出现了错误。出现这种错误推荐网址“http://blog.csdn.net/haungrui/article/details/6959340”

    运行实例:

    hashlib.md5(data)函数中,data参数的类型应该是bytes。也就是说我们在进行hash前必须把数据转换成bytes类型:

    1 import hashlib
    2 m = hashlib.md5(b'123')     # b代表bytes型
    3 m0 = hashlib.md5(b'abc')
    4 mi = m.hexdigest()
    5 mi0 = m0.hexdigest()
    6 print(mi)
    7 print(mi0)

    运行结果:

    1 202cb962ac59075b964b07152d234b70
    2 900150983cd24fb0d6963f7d28e17f72

    对于中文,则进行转码:

     1 import hashlib
     2 data='你好'
     3 m = hashlib.md5(data.encode('gb2312'))
     4 mi = m.hexdigest()
    ---------------------------------------------------
    5 m0 = hashlib.md5(data.encode('utf8')) 6 mi0 = m.hexdigest() 7 print(mi) 8 print(mi0) 9 #运行结果如下(gb2312,utf8一样): 10 # 39505368546302be2704b3d53b24203c 11 # 39505368546302be2704b3d53b24203c
    # 还可以试试这些编码:encode("mbcs")、encode("unicode_escape")
    # 以及encode("raw_unicode_escape")

    # -----数字时相同:
    # c812727996fbf2201fa5ecc0acdccff0
    # c812727996fbf2201fa5ecc0acdccff0
    # -----英文时相同:
    # 39505368546302be2704b3d53b24203c
    # 39505368546302be2704b3d53b24203c
    # -----中文时编码不同,结果不同:
    # f69c425381d6d8936733c6737f7d5a68
    # 0342b5aff1e19bfaaa604e265278e317
    # -----中英结合,中数结合以及中英数三者结合,结果都不同(只有有中文,就不同):
    # 54f836634530a76a2c06e49123f06f1c
    # 3dd056aefd606c44abc9d178e0c1170a

    为什么不能直接hashlib.md5(data),非要强制进行编码转换,设计者的初衷何在?中文字符在Python中是以什么形式存在?

    1 print('%x'%ord(data[0]))
    2 4f60

    中文字符在Python中是以unicode存在的。至此,所有的疑问都得以解除了。
    在hash前要求进行编码转换,是因为同一个字符串在不同的编码体系下有不同的值,为确保不发生歧义必须要进行一次显性转换。

  • 相关阅读:
    Android 手势&触摸事件
    vim常用命令总结
    关于背景中的雪花
    博客园美化——看板娘
    组合数
    扩展欧几里得和求逆元
    dfs序
    RMQ问题
    NOIP2017 列队
    线段树详解
  • 原文地址:https://www.cnblogs.com/Army-Knife/p/10689996.html
Copyright © 2011-2022 走看看