在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对象中的一个字节序列。 编码您的unicodestring到一个字节序列(使用,例如,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'