全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

python版本坑:md5例子(python2与python3中md5区别)

起步

对于一些字符,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  # md5  # Python os.rename() 重命名目录和文件的示例  # Python中使用md5sum检查目录中相同文件代码分享  # Python实现定期检查源目录与备份目录的差异并进行备份功能示例  # Python3如何将源目录中的图片用MD5命名并可以设定目标目录  # 的是  # 报错  # 是一个  # 就会  # 在这里  # 结果是  # 这部  # 我用  # 如果没有  # 要将  # 将它  # 转化为  # 后会  # 这是因为  # 则会  # 先说  # 中不  # 出在  # 可以查看  # 时需 


相关文章: 如何零基础在云服务器搭建WordPress站点?  济南网站制作的价格,历城一职专官方网站?  成都网站制作报价公司,成都工业用气开户费用?  如何通过商城自助建站源码实现零基础高效建站?  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何在阿里云通过域名搭建网站?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  建站之星如何优化SEO以实现高效排名?  如何在Golang中使用replace替换模块_指定本地或远程路径  网站图片在线制作软件,怎么在图片上做链接?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何用PHP快速搭建高效网站?分步指南  nginx修改上传文件大小限制的方法  如何选择高效响应式自助建站源码系统?  英语简历制作免费网站推荐,如何将简历翻译成英文?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  如何快速辨别茅台真假?关键步骤解析  七夕网站制作视频,七夕大促活动怎么报名?  建站之星导航菜单设置与功能模块配置全攻略  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Android自定义控件实现温度旋转按钮效果  如何在万网主机上快速搭建网站?  建站之星代理费用多少?最新价格详情介绍  已有域名和空间如何快速搭建网站?  ,如何利用word制作宣传手册?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  网站制作免费,什么网站能看正片电影?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  太原网站制作公司有哪些,网约车营运证查询官网?  javascript中的try catch异常捕获机制用法分析  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  建站之星Pro快速搭建教程:模板选择与功能配置指南  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  如何选择靠谱的建站公司加盟品牌?  重庆市网站制作公司,重庆招聘网站哪个好?  常州自助建站费用包含哪些项目?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  如何快速搭建响应式可视化网站?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  如何通过VPS建站无需域名直接访问?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  如何通过宝塔面板实现本地网站访问?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  家庭服务器如何搭建个人网站?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  音乐网站服务器如何优化API响应速度?  Python lxml的etree和ElementTree有什么区别  javascript基本数据类型及类型检测常用方法小结  学校为何禁止电信移动建设网站?  如何快速生成专业多端适配建站电话? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。