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 相关文章推荐
pyqt和pyside开发图形化界面
Jan 22 Python
python数据结构树和二叉树简介
Apr 29 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
浅谈python新式类和旧式类区别
Apr 26 Python
安装好Pycharm后如何配置Python解释器简易教程
Jun 28 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
python属于解释语言吗
Jun 11 Python
关于python类SortedList详解
Sep 04 Python
python百行代码实现汉服圈图片爬取
Nov 23 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/02 无线电
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
js格式化时间的方法
2015/12/18 Javascript
拖动时防止选中
2017/02/03 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
jquery中为什么能用$操作
2019/06/18 jQuery
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
Python获取服务器信息的最简单实现方法
2015/03/05 Python
举例讲解Python中的算数运算符的用法
2015/05/13 Python
学习python类方法与对象方法
2016/03/15 Python
python 捕获shell脚本的输出结果实例
2017/01/04 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
python实现双人五子棋(终端版)
2020/12/30 Python
python实现马丁策略的实例详解
2021/01/15 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
抗震救灾标语
2014/06/26 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
材料员岗位职责范本
2015/04/11 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
早安问候语大全
2015/11/10 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server
JS setTimeout与setInterval的区别
2022/04/20 Javascript