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翻译软件实现代码(使用google api完成)
Nov 26 Python
使用python编写脚本获取手机当前应用apk的信息
Jul 21 Python
给Python中的MySQLdb模块添加超时功能的教程
May 05 Python
详解python 字符串和日期之间转换 StringAndDate
May 04 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
Oct 09 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
python opencv调用笔记本摄像头
Aug 28 Python
对python中assert、isinstance的用法详解
Nov 27 Python
python报错: 'list' object has no attribute 'shape'的解决
Jul 15 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
Jun 29 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
一个显示天气预报的程序
2006/10/09 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
php中引用符号(&amp;)的使用详细介绍
2016/12/06 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
解决vue自定义指令导致的内存泄漏问题
2020/08/04 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
wxpython中Textctrl回车事件无效的解决方法
2016/07/21 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
详解Python流程控制语句
2020/10/28 Python
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
财政局长自荐信范文
2013/12/22 职场文书
护理毕业生自荐信范文
2013/12/22 职场文书
招商专员岗位职责
2014/02/08 职场文书
勤俭节约倡议书
2014/04/14 职场文书
创建绿色学校先进个人材料
2014/08/20 职场文书
滴水洞导游词
2015/02/10 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
蜗居观后感
2015/06/11 职场文书
自考生自我评价
2019/06/21 职场文书
Python pandas求方差和标准差的方法实例
2021/08/04 Python
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA