python中的hash unicode字符串

Vla*_*hev 47 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)
Run Code Online (Sandbox Code Playgroud)

在哪里s是这样的:

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

我应该修复什么?

Cam*_*ron 89

显然hashlib.sha1不期望一个unicode对象,而是一个对象中的字节序列str.将unicode字符串编码为字节序列(使用UTF-8编码)应修复它:

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

该错误是因为它尝试使用默认编码将unicode对象str自动转换为自动,该ascii编码无法处理所有非ASCII字符(因为您的字符串不是纯ASCII).

学习更多关于Unicode和编码的一个很好的起点是Python文档,以及Joel Spolsky撰写的这篇文章.

  • +1 Python3正确引发`TypeError:必须在散列之前对Unicode对象进行编码 (3认同)

Jay*_*tel 5

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

>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'
Run Code Online (Sandbox Code Playgroud)