使用过hashlib库的朋友想必都遇到过以下的错误吧:“Unicode-objects must be encoded before hashing”,意思是在进行md5哈希运算前,需要对数据进行编码。而且在不同版本的Python下还有所不同,唉Python还需努力啊,接口和消 息都很不稳定。

hashlib.md5(data)函数中,data参数的类型应该是bytes。也就是说我们在进行hash前必须把数据转换成bytes类型,对于C程序而言似乎没有类似问题,指针强制转换就OK了。

对于中文,有朋友建议转为utf8,同一中文字符串在gb2312和utf8下的值显然是不一样的(连长度都不一样),hash出来的md5会一样吗?
下面是正确的示例:
data = "你好"
m = hashlib.md5(data.encode("gb2312"))
print(m.hexdigest())
如果需要utf8编码下的md5&值,就该是m =
hashlib.md5(data.encode("utf8"))。还可以试试:encode("mbcs")、
encode("unicode_escape")以及encode("raw_unicode_escape")

问题解决了,但是心头的疑问却更多了。为什么不能直接hashlib.md5(data),非要强制进行编码转换,设计者的初衷何在?中文字符在Python中是以什么形式存在?
print('%x'%ord(data[0]))
4f60

说明中文字符在Python中是以unicode存在的。至此,所有的疑问都得以解除了。
在hash前要求进行编码转换,是因为同一个字符串在不同的编码体系下有不同的值,为确保不发生歧义必须要进行一次显性转换。

Python 用hashlib求中文字符串的MD5值 (转自 haungrui的专栏)的更多相关文章

  1. 教你使用python获得字符串的md5值

    最近需要使用python获取字符串的md5值. 今天把代码贴出来和大家分享一下. 01 #!/usr/bin/env python 02 # -*- coding: cp936 -*- 03 impo ...

  2. MD5算法【计算文件和字符串的MD5值】

    1. MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错).任何长度的任意内容都可以用MD5计算出散列值.MD5的前身:MD2.MD3.MD4.介绍工具:CalcMD5 ...

  3. linux下md5sum用法 (查看文件或字符串的md5值)

    MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长 ...

  4. Swift - 获取字符串的MD5值

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现. ...

  5. python基础(数字、字符串、布尔值、字典数据类型简介)

    一 执行第一个python程序 1.下载安装python2.7和python3.6的版本及pycharm,我们可以再解释器中输入这样一行代码: 则相应的就打出了一句话.这里的print是打印的意思.你 ...

  6. java生成字符串的MD5值

    下面的代码实现了MD5值的生成: public class MD5Test2 { public static void main(String[] args) { System.out.println ...

  7. Python使用hashlib模块做字符串加密

    #-*- encoding:gb2312 -*- import hashlib a = "a test string" print 'md5 = %s' % (hashlib.md ...

  8. Python的基本数据数字、字符串、布尔值及其魔法

    基本数据类型介绍 若要把Pyhton的基本数据类型:数字(int).字符串(str).布尔(bool).列表(list).元组(tuple).字典(dict)都分为一个个不同的角色 如:战士,魔法师, ...

  9. JAVA字符串转换MD5值

    简介: MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5 ...

随机推荐

  1. Thift初探 (一)

    Maven pox.xml: <dependency> <groupId>org.apache.thrift</groupId> <artifactId> ...

  2. WPF中打开网页的两种方法

    1.浏览器打开 Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = "http://www. ...

  3. commit 没有提交图片,但是出现了commit的修改

    .gitignore里面写上 image/cache/  就好了

  4. 用vs2017对C#代码进行单元测试

    1.打开vs2017->工具->扩展与更新->联机 进行搜索Unit,截图如下: 创建C#项目: 将测试代码复制到里边,这里用到的是老师课上给的实验代码: public class ...

  5. ip6tables命令

    ip6tables命令和iptables一样,都是linux中防火墙软件,不同的是ip6tables采用的TCP/ip协议为IPv6. 语法 ip6tables(选项) 选项 -t<表>: ...

  6. python -- 安装+pip+requests

    python3 安装库 sudo python3 -m pip install beautifulsoup4   步骤1:安装pyenv 为了能顺利的将系统的python和下载的python版本呼唤, ...

  7. LightGBM与评分卡

    调参策略 最大化 off_ks + 0.8(off_ks-train_ks) import pandas as pd from sklearn.metrics import roc_auc_score ...

  8. Vue 缓存当前页面keep-alive

    需求: 产品经理在列表页(几千个数据,n个page)点击某一项进去到详情页后,再返回到列表页发现页面回到了第一页,找不到之前的查看的是哪一条了,为了方便咋公司产品经理,返回列表页时需要记住之前的pag ...

  9. 【转】python selenium2 中的显示等待WebDriverWait与条件判断expected_conditions举例

    #coding=utf-8 from selenium import webdriver from selenium.webdriver.common.by import By from seleni ...

  10. OpenStack Heat模板详解

    Heat模板全称为heat orchestration template,简称为HOT. 1 典型Heat模板结构 heat_template_version: 2015-04-30 descript ...