哈希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ћ÷…•∆љ∆•…љ∆•…љ∆•…∆љ•…∆љ•…љ∆•…∆•…∆•…∆•∆…•÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…
我应该怎么解决?
显然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 docs和article by Joel Spolsky。
+1 Python3正确提出'TypeError:Unicode对象必须在散列之前编码' – jfs 2011-03-14 13:11:16
非常好的答案。非常感谢,它有帮助。 (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内存表示等。
这是一个Unicode字符串吗? – 2017-03-13 10:47:11