2011-03-13 11 views
43

Trato de hash de algunas cadenas Unicode:hash de cadena Unicode en Python

hashlib.sha1(s).hexdigest() 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-81: 
ordinal not in range(128) 

donde s es algo así como:

œ∑¡™£¢∞§¶•ªº–≠œ∑´®†¥¨ˆøπ“‘åß∂ƒ©˙∆˚¬…æΩ≈ç√∫˜µ≤≥÷åйцукенгшщзхъфывапролджэячсмитьбююю..юбьтијџўќ†њѓѕ'‘“«««\dzћ÷…•∆љl«єђxcvіƒm≤≥ї[email protected]#$©^&*(()––––––––––∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆•…÷ћzdzћ÷…•∆љlљ∆•…÷ћzћ÷…•∆љ∆•…љ∆•…љ∆•…∆љ•…∆љ•…љ∆•…∆•…∆•…∆•∆…•÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…

¿Qué debo fijar?

+0

¿Es esto una cadena Unicode? –

Respuesta

78

Aparentemente hashlib.sha1 no espera un objeto unicode, sino una secuencia de bytes en un objeto str. La codificación de la cadena de unicode a una secuencia de bytes (usando, por ejemplo, la codificación UTF-8) debe solucionarlo:

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

El error se debe a que está tratando de convertir el objeto unicode a un str de forma automática, utilizando el codificación predeterminada ascii, que no puede manejar todos esos caracteres no ASCII (ya que su cadena no es pura ASCII).

Un buen punto de partida para aprender más sobre Unicode y codificaciones es el Python docs, y este article by Joel Spolsky.

+2

+1 Python3 plantea correctamente 'TypeError: los objetos Unicode deben codificarse antes de hash' – jfs

+0

Muy buena respuesta. Muchas gracias, ayuda. (python2.7) –

2

Usar el formato de codificación utf-8, trate de esta manera fácil,

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

You bytes hash, no cadenas. Así que debes saber qué bytes realmente quieres hash, si es una representación de la memoria utf8 de la cadena, una representación de la memoria utf16 de la cadena, etc.

Cuestiones relacionadas