哈希unicode字符串在python

问题描述:

我尝试哈希一些unicode字符串:哈希unicode字符串在python

hashlib.sha1(s).hexdigest() 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-81: 
ordinal not in range(128) 

其中s是一样的东西:

œ∑¡™£¢∞§¶•ªº–≠œ∑´®†¥¨ˆøπ“‘åß∂ƒ©˙∆˚¬…æΩ≈ç√∫˜µ≤≥÷åйцукенгшщзхъфывапролджэячсмитьбююю..юбьтијџўќ†њѓѕ'‘“«««\dzћ÷…•∆љl«єђxcvіƒm≤≥ї[email protected]#$©^&*(()––––––––––∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆•…÷ћzdzћ÷…•∆љlљ∆•…÷ћzћ÷…•∆љ∆•…љ∆•…љ∆•…∆љ•…∆љ•…љ∆•…∆•…∆•…∆•∆…•÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…

我应该怎么解决?

+0

这是一个Unicode字符串吗? – 2017-03-13 10:47:11

显然hashlib.sha1不期待unicode对象,而是str对象中的一个字节序列。编码您unicode字符串字节(使用,也就是说,UTF-8编码)的顺序应该修复它:

>>> import hashlib 
>>> s = u'é' 
>>> hashlib.sha1(s.encode('utf-8')) 
<sha1 HASH object @ 029576A0> 

的错误是因为它试图将unicode对象自动转换为str,使用默认ascii编码,它不能处理所有这些非ASCII字符(因为你的字符串不是纯ASCII)。

了解Unicode和编码的一个很好的起点是Python docsarticle by Joel Spolsky

+2

+1 Python3正确提出'TypeError:Unicode对象必须在散列之前编码' – jfs 2011-03-14 13:11:16

+0

非常好的答案。非常感谢,它有帮助。 (python2.7) – 2013-12-30 13:24:41

使用的编码格式utf-8,试试这个简单的方法,

>>> import hashlib 
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f' 

你哈希字节,而不是字符串。所以你必须知道你真正想要散列什么字节,如果字符串的utf8内存表示,字符串的utf16内存表示等。