Python 用hashlib求中文字符串的MD5值 (转自 haungrui的专栏)
使用过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的专栏)的更多相关文章
- 教你使用python获得字符串的md5值
最近需要使用python获取字符串的md5值. 今天把代码贴出来和大家分享一下. 01 #!/usr/bin/env python 02 # -*- coding: cp936 -*- 03 impo ...
- MD5算法【计算文件和字符串的MD5值】
1. MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错).任何长度的任意内容都可以用MD5计算出散列值.MD5的前身:MD2.MD3.MD4.介绍工具:CalcMD5 ...
- linux下md5sum用法 (查看文件或字符串的md5值)
MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长 ...
- Swift - 获取字符串的MD5值
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现. ...
- python基础(数字、字符串、布尔值、字典数据类型简介)
一 执行第一个python程序 1.下载安装python2.7和python3.6的版本及pycharm,我们可以再解释器中输入这样一行代码: 则相应的就打出了一句话.这里的print是打印的意思.你 ...
- java生成字符串的MD5值
下面的代码实现了MD5值的生成: public class MD5Test2 { public static void main(String[] args) { System.out.println ...
- Python使用hashlib模块做字符串加密
#-*- encoding:gb2312 -*- import hashlib a = "a test string" print 'md5 = %s' % (hashlib.md ...
- Python的基本数据数字、字符串、布尔值及其魔法
基本数据类型介绍 若要把Pyhton的基本数据类型:数字(int).字符串(str).布尔(bool).列表(list).元组(tuple).字典(dict)都分为一个个不同的角色 如:战士,魔法师, ...
- JAVA字符串转换MD5值
简介: MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5 ...
随机推荐
- php 多维数组,根据某个特定字段过滤重复值
//假如 数据是这样的$arr=[ [ 'goods_name'=>'xxx', 'goods_id'=>111,],[ 'goods_name'=>'xxx', 'goods_id ...
- PowerShell中汉字与ASCII码相互转换
function asc($param) { $rtn = '' $list = $param -split '' foreach ($char in $list) { if($char -ne '' ...
- codeforces1187E
题目链接:http://codeforces.com/problemset/problem/1187/E E. Tree Painting You are given a tree (an undir ...
- 怎么看部分元素的js代码?
- Redis学习(一) —— 基本使用与原理
一.数据结构 string Redis字符串是可修改字符串,在内存中以字节数组形式存在. 下面是string在源码中的定义,SDS(Simple Dynamic String) struct SDS& ...
- Java核心复习——J.U.C ArrayBlockingQueue源码分析
介绍 依赖关系 源码 构造方法 public ArrayBlockingQueue(int capacity) { this(capacity, false);//默认构造非公平的有界队列 } pub ...
- 什么是IO流
先看一段百度上的解释: 当然:如果你看不懂,那么你只需要记住下面3句话. 1. (1).我们知道,每个人家里喝的水都是从自来水厂来的,自来水厂的水又是从水源地来的, (2).水是通过水管来的. (3) ...
- node.js 简易聊天室
效果图 首先开启server.js 打开服务器端,然后打开client.js,注册用户.打开一个注册一个用户,打开三个,注册三个用户. 接下来,小王发布一个广播消息,小李和小刘都收到了此消息. 接下来 ...
- [转]解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists).
Git fetch和git pull的区别: 都可以从远程获取最新版本到本地 1.Git fetch:只是从远程获取最新版本到本地,不会merge(合并) $:git fetch origin mas ...
- 自然语言处理基础与实战(8)- 主题模型LDA理解与应用
本文主要用于理解主题模型LDA(Latent Dirichlet Allocation)其背后的数学原理及其推导过程.本菇力求用简单的推理来论证LDA背后复杂的数学知识,苦于自身数学基础不够,因此文中 ...