Python 用hashlib求中文字符串的MD5值 (转自 haungrui的专栏)

使用过hashlib库的朋友想必都遇到过如下的错误吧:“Unicode-objects must be encoded before hashing”,意思是在进行md5哈希运算前,须要对数据进行编码。并且在不一样版本的Python下还有所不一样,唉Python还需努力啊,接口和消 息都很不稳定。

hashlib.md5(data)函数中,data参数的类型应该是bytes。也就是说咱们在进行hash前必须把数据转换成bytes类型,对于C程序而言彷佛没有相似问题,指针强制转换就OK了。

对于中文,有朋友建议转为utf8,哭同一中文字符串在gb2312和utf8下的值显然是不同的(连长度都不同),hash出来的md5会同样吗?
下面是正确的示例:
data = "你好"
m = hashlib.md5(data.encode("gb2312"))
print(m.hexdigest())
若是须要utf8编码下的md5&值,就该是m = hashlib.md5(data.encode("utf8"))。还能够试试:encode("mbcs")、 encode("unicode_escape")以及encode("raw_unicode_escape")

问题解决了,可是心头的疑问却更多了。为何不能直接hashlib.md5(data),非要强制进行编码转换,设计者的初衷何在?中文字符在Python中是以什么形式存在?
print('%x'%ord(data[0]))
4f60


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

相关文章
相关标签/搜索