Python中如何对Unicode字符串进行哈希处理

51

我尝试对一些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ћ÷…•∆љ∆•…љ∆•…љ∆•…∆љ•…∆љ•…љ∆•…∆•…∆•…∆•∆…•÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…

我应该修复什么?


这是一个Unicode字符串吗? - Sassa NF
3个回答

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撰写的文章

4
Python3 正确地引发了 TypeError: Unicode-objects must be encoded before hashing 错误。 - jfs

5

请使用编码格式为utf-8,尝试这种简单的方式。

>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'

0

你要哈希的是 bytes,而不是 strings。因此,你需要知道你真正想要哈希的字节,例如字符串的 utf8 内存表示或 utf16 内存表示等。


1
这个应该作为评论发布在问题下面,而不是作为答案,因为它没有提供原作者的请求,即:应该修复什么? - teunbrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接