python中的hash unicode字符串

时间:2011-03-13 20:46:43

标签: python unicode utf-8

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

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≤≥ї@#$ ^©&安培;!*(()----------ΔΔΔΔΔΔΔΔΔ ΔΔΔΔΔΔΔΔΔΔ•...÷÷ћzdzћ...•ΔљlљΔ•...÷÷ћzћ...•ΔљΔ•...љΔ•...љΔ•...Δљ•...Δљ•...љΔ •...Δ•...Δ•...Δ•Δ...•÷Δ•...÷Δ•...÷Δ•...÷Δ•...÷Δ•...÷Δ•...÷Δ•...

我该修理什么?

3 个答案:

答案 0 :(得分:84)

显然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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

您散列字节,而不是字符串。所以你必须知道你真正想要散列的字节数,字符串的utf8内存表示,字符串的utf16内存表示等等。