python中的hash unicode字符串

2024-05-17 17:18:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我该怎么办?


Tags: 字符串inasciiunicodenotpositioncansha1
3条回答

你散列bytes,而不是strings。所以你必须知道你真正想要散列的字节,例如字符串的utf8内存表示或字符串的utf16内存表示,等等

使用编码格式utf-8,试试这个简单的方法

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

显然hashlib.sha1不需要unicode对象,而是str对象中的字节序列。将unicode字符串编码为一个字节序列(例如,使用UTF-8编码)应该可以解决这个问题:

>>> import hashlib
>>> s = u'é'
>>> hashlib.sha1(s.encode('utf-8'))
<sha1 HASH object @ 029576A0>

错误是因为它正在尝试使用默认的ascii编码自动将str对象转换为unicode对象,该编码无法处理所有这些非ASCII字符(因为字符串不是纯ASCII字符)。

学习更多关于Unicode和编码的一个好的起点是Python docs,而这个article by Joel Spolsky

相关问题 更多 >