廖雪峰的官方网站学习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前要求进行编码转换,是因为同一个字符串在不同的编码体系下有不同的值,为确保不发生歧义必须要进行一次显性转换。