在python中散列unicodestring
我尝试散列一些Unicodestring:
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ћ…•ΔљΔ•…љΔ•…љΔ•…Δљ•…Δљ•…љΔ•…Δ• …Δ•…Δ•Δ…•÷Δ•…÷Δ•…÷Δ•…÷Δ•…÷Δ•…÷Δ•…÷Δ•…
我应该修补什么?
显然hashlib.sha1
并不期待一个unicode
对象,而是一个str
对象中的一个字节序列。 编码您的unicode
string到一个字节序列(使用,例如,UTF-8编码)应该修复它:
>>> import hashlib >>> s = u'é' >>> hashlib.sha1(s.encode('utf-8')) <sha1 HASH object @ 029576A0>
这个错误是因为它试图将unicode
对象自动转换为str
,使用默认的ascii
编码,不能处理所有这些非ASCII字符(因为你的string不是纯ASCII)。
学习更多关于Unicode和编码的一个好的起点是Python文档和Joel Spolsky写的这篇文章 。
使用编码格式utf-8
,试试这个简单的方法,
>>> import hashlib >>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'