objects - python 3.6 hashlib
hashlib.md5() TypeError: los objetos Unicode se deben codificar antes del hashing (4)
Soy nuevo en la codificación y me he encontrado con un problema al intentar codificar una cadena.
>>> import hashlib
>>> a = hashlib.md5()
>>> a.update(''hi'')
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
a.update(''hi'')
TypeError: Unicode-objects must be encoded before hashing
>>> a.digest()
b''/xd4/x1d/x8c/xd9/x8f/x00/xb2/x04/xe9/x80/t/x98/xec/xf8B~''
¿Se considera (a) ahora que está codificado?
Segunda pregunta: cuando ejecuto el mismo código anterior en un script, aparece este error:
import hashlib
a = hashlib.md5()
a.update(''hi'')
a.digest()
Seguimiento (última llamada más reciente): archivo "C: / Users / User / Desktop / Logger / Encoding practice.py", línea 3, en a.update (''hi'') TypeError: Los objetos Unicode deben codificarse antes de realizar el hashing
¿Por qué el código funciona en el shell y no en el script? Estoy trabajando con Windows y Python 3.4
Gracias.
Bajo las diferentes versiones de Python es diferente, yo uso Python 2.7, lo mismo que escribes, funciona bien.
Función hashlib.md5 (datos), el tipo de parámetros de datos debe ser ''bytes''. Es decir, debemos colocar el tipo de datos en bytes antes de los hashes.
Requisitos antes de la conversión del código hash, porque la misma cadena tiene diferentes valores en diferentes sistemas de codificación (utf8 / gbk .....), para garantizar que la ambigüedad no ocurra tiene que ser una conversión dominante.
Dado que está codificando cadenas simples, deduzco que está ejecutando Python 3, donde todas las cadenas son objetos Unicode, tiene dos opciones:
- Proporcione una codificación para las cadenas, por ejemplo:
"Nobody inspects".encode(''utf-8'')
Use cadenas binarias como se muestra en los manuales:
m.update(b"Nobody inspects") m.update(b" the spammish repetition")
El motivo del comportamiento diferente en el script para el shell es que el script se detiene en el error, mientras que en el shell la última línea es un comando separado pero aún no hace lo que desea debido al error anterior.
La solución que he encontrado es simplemente codificar los datos de inmediato en la línea en la que los hash:
hashlib.sha256("a".encode(''utf-8'')).hexdigest()
Funcionó para mí, espero que ayude!
No está funcionando en el REPL. No se ha roto nada, ya que no se ha pasado nada válido para el hash. Intenta codificar primero.
3>> hashlib.md5().digest()
b''/xd4/x1d/x8c/xd9/x8f/x00/xb2/x04/xe9/x80/t/x98/xec/xf8B~''
3>> a = hashlib.md5()
3>> a.update(''hi''.encode(''utf-8''))
3>> a.digest()
b''I/xf6/x8a///x84/x93/xec,/x0b/xf4/x89/x82/x1c!/xfc;''