我尝试哈希一些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ћ...•ΔљΔ•...љΔ•...љΔ•...Δљ•...Δљ•...љΔ •...Δ•...Δ•...Δ•Δ...•÷Δ•...÷Δ•...÷Δ•...÷Δ•...÷Δ•...÷Δ•...÷Δ•...
我该修理什么?
答案 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 docs和article by Joel Spolsky。
答案 1 :(得分:3)
使用编码格式utf-8
,试试这个简单的方法,
>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'
答案 2 :(得分:0)
您散列字节,而不是字符串。所以你必须知道你真正想要散列的字节数,字符串的utf8内存表示,字符串的utf16内存表示等等。