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的re模块正则表达式操作
May 25 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
Python读写及备份oracle数据库操作示例
May 17 Python
Python3 max()函数基础用法
Feb 19 Python
java判断三位数的实例讲解
Jun 10 Python
在TensorFlow中屏蔽warning的方式
Feb 04 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
Feb 26 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
May 26 Python
通过代码实例了解Python异常本质
Sep 16 Python
python绘制分布折线图的示例
Sep 24 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
Mar 22 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字符串分割函数explode的实例代码
2013/02/07 PHP
php header功能的使用
2013/10/28 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
windows下vue-cli导入bootstrap样式
2017/04/25 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
Python中Collection的使用小技巧
2014/08/18 Python
Python缩进和冒号详解
2016/06/01 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
Python3读取Excel数据存入MySQL的方法
2018/05/04 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
python迭代器常见用法实例分析
2019/11/22 Python
详解HTML5中的Communication API基本使用方法
2016/01/29 HTML / CSS
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
旅游管理专业生自荐信范文
2014/01/02 职场文书
八一演出活动方案
2014/02/03 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
廉洁教育学习材料
2014/05/19 职场文书
安全生产标语
2014/06/06 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
世界文化遗产导游词
2019/08/07 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android