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中使用urllib2伪造HTTP报头的2个方法
Jul 07 Python
Python写的英文字符大小写转换代码示例
Mar 06 Python
Python实现的生成格雷码功能示例
Jan 24 Python
Python编程深度学习绘图库之matplotlib
Dec 28 Python
python抓取需要扫微信登陆页面
Apr 29 Python
python 中pyqt5 树节点点击实现多窗口切换问题
Jul 04 Python
python实现猜数字游戏
Mar 25 Python
python实现两个一维列表合并成一个二维列表
Dec 02 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
Jan 18 Python
Django Xadmin多对多字段过滤实例
Apr 07 Python
python3.6中anaconda安装sklearn踩坑实录
Jul 28 Python
Python下使用Trackbar实现绘图板
Oct 27 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
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
也谈 PHP 和 MYSQL
2006/10/09 PHP
解析CI即CodeIgniter框架在Nginx下的重写规则
2013/06/03 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
jQuery each()小议
2010/03/18 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
2019/04/01 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
2020/05/17 Python
python如何查看安装了的模块
2020/06/23 Python
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
尼克松手表官网:Nixon手表
2019/03/17 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
幼儿园保育员辞职信
2014/01/12 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
学习委员竞选稿
2015/11/20 职场文书
python基础之停用词过滤详解
2021/04/21 Python
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server
python Django框架快速入门教程(后台管理)
2021/07/21 Python
利用Python实现模拟登录知乎
2022/05/25 Python
Python如何利用pandas读取csv数据并绘图
2022/07/07 Python
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技