在Python中哈希Unicode字符串
我在尝试对一些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
你要对的是 字节
,而不是 字符串
。所以你得搞清楚你到底想要哈希哪些字节,比如字符串的 UTF-8 内存表示或者 UTF-16 内存表示等等。
5
使用编码格式 utf-8
,试试这个简单的方法,
>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'
93
看起来 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 文档,还有这篇 Joel Spolsky 的文章。