python版本坑:md5例子(python2与python3中md5区别)


Posted in Python onJune 20, 2017

起步

对于一些字符,python2和python3的md5加密出来是不一样的.

# python2.7
pwd = "xxx" + chr(163) + "fj"
checkcode = hashlib.md5(pwd).hexdigest()
print checkcode # ea25a328180680aab82b2ef8c456b4ce

# python3.6
pwd = "xxx" + chr(163) + "fj"
checkcode = hashlib.md5(pwd.encode("utf-8")).hexdigest()
print(checkcode) # b517e074034d1913b706829a1b9d1b67

按代码差异来将,就是在python3中需要对字符串进行 encode 操作,如果没有则会报错:

checkcode = hashlib.md5(pwd).hexdigest()
TypeError: Unicode-objects must be encoded before hashing

这是因为加密时需要将字符串转化为 bytes 类型,3默认编码是 utf-8 .所以我用utf-8进行解码.

分析

如果字符串中没有 chr(163) ,那么两个版本结果是一致的,也就是说问题出在这个chr(163)中:

# python2.7
>>> chr(163)
'\xa3'

# python3.6
>>> chr(163)
'\xa3'

在这里说明通过 chr 得到的结果是一致的, 将它转为 bytes 类型看看:

# python2.7
>>> bytes(chr(163))
'\xa3'

# python3.6
>>> chr(163).encode()
b'\xc2\xa3'

python3中,在 num<128 的时候,使用 chr(num).encode('utf-8') 得到的是 一个 字符的ascii十六进制,而 num>128 的时候,使用 chr(num).encode('utf-8') 得到的是 两个 字节的ascii十六进制.

解决
改用 latin1 编码进行解码:

# python3.6
pwd = "xxx" + chr(163) + "fj"
checkcode = hashlib.md5(pwd.encode("latin1")).hexdigest()
print(checkcode)  # ea25a328180680aab82b2ef8c456b4ce

额外
为什么是 latin1 编码呢.答案还是挺有意思的.

先说chr函数,通过 help(chr) 可以查看:

chr(...)
  chr(i) -> Unicode character
  Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.

意思是它返回Unicode编码中指定位置的一个字符.python3内部也是用Unicode表示左右字符,即str类型.而通过encode后会编码成 bytes 类型.

ascii编码中每个字符编码是一个byte,但只有1-127. 超过的部分128-255则属于 Extended ASCII ,python3 中默认的ascii中不包含这部分,所以如果执行 chr(163).encode("ascii") 就会报错 'ascii' codec can't encode character '\xa3' in position 3: ordinal not in range(128)

因此需要一个含有128-255中的部分字符的编码,且采用1个Byte固定大小编码,比如ISO 8859-1,也就是 latin1.当然还有其他编码如cp1252也包含这些字符的.

Python 相关文章推荐
Python写的英文字符大小写转换代码示例
Mar 06 Python
Python将xml和xsl转换为html的方法
Mar 10 Python
详解Python中break语句的用法
May 14 Python
Python找出list中最常出现元素的方法
Jun 14 Python
python中实现数组和列表读取一列的方法
Apr 03 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
Apr 01 Python
基于python中__add__函数的用法
Nov 25 Python
opencv之为图像添加边界的方法示例
Dec 26 Python
python实现人像动漫化的示例代码
May 17 Python
Flask缓存静态文件的具体方法
Aug 02 Python
浅谈对python中if、elif、else的误解
Aug 20 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
Jun 20 #Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 #Python
回调函数的意义以及python实现实例
Jun 20 #Python
Python处理Excel文件实例代码
Jun 20 #Python
python构建自定义回调函数详解
Jun 20 #Python
Python实现完整的事务操作示例
Jun 20 #Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 #Python
You might like
PHP Smarty生成EXCEL文档的代码
2008/08/23 PHP
php利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
php skymvc 一款轻量、简单的php
2011/06/28 PHP
php汉字转拼音的示例
2014/02/27 PHP
smarty简单分页的实现方法
2014/10/27 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
15条JavaScript最佳实践小结
2013/08/09 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
vue.js的提示组件
2017/03/02 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
jquery中each循环的简单回滚操作
2017/05/05 jQuery
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
在Python中操作字典之fromkeys()方法的使用
2015/05/21 Python
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
python生成器与迭代器详解
2019/01/01 Python
Python容器使用的5个技巧和2个误区总结
2019/09/26 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
Perricone MD裴礼康美国官网:抗衰老护肤品
2016/09/26 全球购物
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
计算机系毕业生推荐信
2013/11/06 职场文书
工作表现自我评价
2014/02/08 职场文书
精彩广告词大全
2014/03/19 职场文书
公司请假条格式
2014/04/11 职场文书
创业融资计划书
2014/04/25 职场文书
酒店开业策划方案
2014/06/02 职场文书
投资意向书
2014/07/30 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
雷锋观后感
2015/06/10 职场文书
小学新课改心得体会
2016/01/22 职场文书