Python 用hashlib求中文字符串的MD5值

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Redux/Mobx] Mobx的设计思想是什么

[Redux/Mobx] Mobx的设计思想是什么 依赖收集。在Mobx中,定义了observable的属性,mobx会自动跟踪这个属性值的变化;在用了mobx与react的桥接库mobx-react之后,这种跟踪关系会体现了视图上,JSX依赖的observable属性值变…

csu 1008 - Horcrux

不得不表示,能用栈来做的题目前对我来说都很费解,这题又是抄的,来自校友JMDWQ,只不过把C改成了C。开始时我用的是暴搜,数组的每一位就是一个“魂器”,而他的栈结构里每一位是连续相同的“魂器”的长度&…

0301——SearchController

创建显示的页面 SearchViewController * searchVC [[SearchViewController alloc]init]; 告诉搜索控制器将结果显示在创建的页面上 self.searchController [[UISearchController alloc]initWithSearchResultsController:searchVC]; 由谁来监听搜索内容发生的事件 self.search…

[Redux/Mobx] 推荐在reducer中触发Action吗?为什么?

[Redux/Mobx] 推荐在reducer中触发Action吗?为什么? 不推荐。首先reducer应该是一个纯函数,reducer中的代码应该把代码逻辑限定在当前的reducer内,如果触发了action,会触发其它的reducer、甚至再次触发自身&#xff0…

windows等宽字体

From: http://plplum.blog.163.com/blog/static/310324002009814105634/ windows下的等宽字体: BatangChe Courier Courier New DotumChe Fixedsys GulimChe GungsuhChe Lucida Console Lucida Sans Typewriter MingLiU MS Gothic MS Mincho Terminal 仿宋_GB2312 楷…

JS中的Replace方法

最近查一个bug,原因是JS中的Replace方法造成的,当将一个字符串中有处需要替换时,一般会用到JS中的Replace方法,Replace方法的第一个参数如果是传的字符串,只会替换第一处。代码如下: var str "0CEA65…

sed替换变量

今天在写脚本时用到了sed,我用sed替换xml文件中的变量。一般在sed 中替换都用单引号,如下边 sed -i ‘s/10/1000/g’ test.xml但是如果需要把1000改成变量,如sed -i ’s/10/$num/g‘ test.xml这样就不成功。 此时需要把单引号改成双引号,如下…

[Redux/Mobx] 你有了解Rxjs是什么吗?它是做什么的?

[Redux/Mobx] 你有了解Rxjs是什么吗?它是做什么的? RxJS 是一个库,它通过使用 observable 序列来编写异步和基于事件的程序。它提供了一个核心类型 Observable,附属类型 (Observer、 Schedulers、 Subjects) 和受 [Array#extras]…

使用Windows命令行启动服务

From: http://www.cnblogs.com/wlei/archive/2011/12/24/2300389.html 在自己电脑上搭建了一个svn服务器,以服务的形式注册到了windows中,每次启动都要去服务选项中开启,感觉很麻烦,GOOGLE了一下,发现早就有了好方法&a…

mysql cluster 7.1搭建

简单步骤,分享下: hostname IP 应用 db1 192.168.50.10 MGM db2 192.168.50.20 NDBD db3 192.168.50.30 NDBD2 db4 192.168.50.40 MYSQLD db5 192.168.50.50 MYSQLD ***************************** 1.安装配置管理节点(DB1)MGM ************…

redis实现cache系统实践(六)

1. 介绍 rails中就自带有cache功能,不过它默认是用文件来存储数据的。我们要改为使用redis来存储。而且我们也需要把sessions也存放到redis中。关于rails实现cache功能的源码可见于这几处: https://github.com/rails/rails/blob/master/activesupport/lib/active_su…

[Redux/Mobx] 在redux中,什么是action?

[Redux/Mobx] 在redux中,什么是action? action是Redux中定义一个响应的动作,action总是有一个type属性,作为这个动作的唯一标识; Reducer函数则会根据这个action.type来如何生成并返回一个新的state 个人简介 我是歌谣&#x…

VMware 9 安装 Mac OS X 10.8 Mountain Lion 图文全程

From: http://unmi.cc/vmware9-install-mac-os-x-mountain-lion/#comment-8684 本教程是在 VMware 9 下安装当前最新版的 Mac OS X Mountain Lion 苹果系统。曾在 VirtualBox/VMware 下安装过 Mac OS Lion 系统,但安装后是无法升级到 Mountain Lion 的,所…

显示和快速隐藏Mac桌面所有图标

隐藏:defaults write com.apple.finder CreateDesktop -bool false;killall Finder;say icons hidden恢复显示:defaults write com.apple.finder CreateDesktop -bool true;killall Finder;say icons show上面的操作甚至可以制作成为一个Applescript&…

正则表达式基础恶补

1.基本用途 正则表达式两种基本用途:搜索和替换。 2.单个字符匹配(.).字符可以匹配任何单个字符,类似于sql中的_。注意特殊字符匹配时要使用反斜杠\\。 3.匹配一组字符([])[]之间的所有字符都是该集合的组成部分,字符集合的匹配结果是能够与集…

[Redux/Mobx] Mobx和Redux有什么区别?

[Redux/Mobx] Mobx和Redux有什么区别? Redux每一次的dispatch都会从根reducer到子reducer嵌套递归的执行,所以效率相对较低;而Mobx的内部使用的是依赖收集,所以不会有这个问题,执行的代码较少,性能相对更高…

ANSIC标准定义的6种预定义宏

From: http://biancheng.dnbcw.info/c/277439.html ANSIC标准定义了以下6种可供C语言使用的预定义宏: __LINE__ 在源代码中插入当前源代码行号 __FILE__ 在源代码中插入当前源代码文件名 …

初识Vulkan

Vulkan是Khronos组织制定的“下一代”开放的图形显示API,是与DirectX12可以匹敌的GPU API标准。Vulkan是基于AMD的Mantle API演化而来,目前Vulkan 1.0标准已经完成并正式发布。上一代的OpenGL|ES并不会被遗弃,还会继续发展,很有可…

[Redux/Mobx] 说说Redux的实现流程

[Redux/Mobx] 说说Redux的实现流程 通过分析redux的几个核心api,来看如何实现redux store.subscribe: 订阅数据的变化store.dispatch:dispatch后改变state,同时通知store.subscribe函数执行,上面这两个函数可以利用发布-订阅模式store.getS…

数据镜像备份工具rsync

rsync可以用来实现数据本地镜像和远程备份。 1,可以镜像保存整个目录和文件。 2,可以增量同步数据,文件传输率高。 3,可以保持原文件的权限,时间等属性。 4,可以加密传输数据。 5,可以使用rcp、…