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提示No module named images的解决方法
Sep 29 Python
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
Python扩展内置类型详解
Mar 26 Python
解决pycharm无法调用pip安装的包问题
May 18 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
python3.7 使用pymssql往sqlserver插入数据的方法
Jul 08 Python
Python绘制二维曲线的日常应用详解
Dec 04 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
VScode连接远程服务器上的jupyter notebook的实现
Apr 23 Python
python 还原梯度下降算法实现一维线性回归
Oct 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模板引擎技术简单实现
2016/03/15 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
2016/12/28 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
python数据结构树和二叉树简介
2014/04/29 Python
在Python中进行自动化单元测试的教程
2015/04/15 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
python各类经纬度转换的实例代码
2019/08/08 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
python数据类型强制转换实例详解
2020/06/22 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
班班通项目实施方案
2014/02/25 职场文书
群教个人对照检查材料
2014/08/20 职场文书
学生实习证明模板汇总
2014/09/25 职场文书
语文教师个人工作总结
2015/02/06 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
Python函数中apply、map、applymap的区别
2021/11/27 Python
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang