在Python中哈希Unicode字符串

51 投票
3 回答
37488 浏览
提问于 2025-04-16 13:37

我在尝试对一些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 的文章

撰写回答