Python 用hashlib求中文字符串的MD5值
来源:互联网 发布:逆战挂机宏数据 编辑:程序博客网 时间:2024/06/17 13:55
http://blog.csdn.net/haungrui/article/details/6959340
使用过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前要求进行编码转换,是因为同一个字符串在不同的编码体系下有不同的值,为确保不发生歧义必须要进行一次显性转换。
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前要求进行编码转换,是因为同一个字符串在不同的编码体系下有不同的值,为确保不发生歧义必须要进行一次显性转换。
- Python 用hashlib求中文字符串的MD5值
- Python 用hashlib求中文字符串的MD5值
- Python 用hashlib求中文字符串的MD5值
- Python 用hashlib求中文字符串的MD5值
- Python 用hashlib求中文字符串的MD5值
- Python 用hashlib求中文字符串的MD5值
- python的hashlib字符串加密模块
- python的hashlib字符串加密模块
- hashlib —— Python 的 md5 和 sha1 加密
- Python的hashlib模块
- Python的hashlib
- Python的hashlib模块
- python:自定义函数、hashlib(md5、sha1)、base64
- 使用python求字符串或文件的MD5
- python的加密模块 hashlib
- Python使用hashlib模块做字符串加密
- python模块之hashlib: md5和sha算法
- Python hashlib模块 (主要记录md5加密)
- 设计模式六大原则(4):接口隔离原则
- php const用法详解
- 礼拜天的下午
- Customize lisp program
- socket编程问题-SIGPIPE信号处理
- Python 用hashlib求中文字符串的MD5值
- 设计模式六大原则(5):迪米特法则
- ExtJs4 笔记(1) ExtJs大比拼JQuery:Dom文档操作
- 设计模式六大原则(6):开闭原则
- JavaScript HTML对象属性用法
- Delphi移动无标题窗体...
- JAX-WS 开发webservices实例
- poj 3664 Election Time
- ZOJ 1494 Climbing Worm