2011-03-13 117 views
43

我嘗試哈希一些unicode字符串:哈希unicode字符串在python

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≤≥ї[email protected]#$©^&*(()––––––––––∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆•…÷ћzdzћ÷…•∆љlљ∆•…÷ћzћ÷…•∆љ∆•…љ∆•…љ∆•…∆љ•…∆љ•…љ∆•…∆•…∆•…∆•∆…•÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…

我應該怎麼解決?

+0

這是一個Unicode字符串嗎? – 2017-03-13 10:47:11

回答

78

顯然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 docsarticle by Joel Spolsky

+2

+1 Python3正確提出'TypeError:Unicode對象必須在散列之前編碼' – jfs 2011-03-14 13:11:16

+0

非常好的答案。非常感謝,它有幫助。 (python2.7) – 2013-12-30 13:24:41

2

使用的編碼格式utf-8,試試這個簡單的方法,

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

你哈希字節,而不是字符串。所以你必須知道你真正想要散列什麼字節,如果字符串的utf8內存表示,字符串的utf16內存表示等。