¿Es un compendio MD5 en este script en Python?
Pregunta
Estoy tratando de entender el código hashlib simple en Python que se ha dado a mí el otro día en Stackoverflow:
import hashlib
m = hashlib.md5()
m.update("Nobody inspects")
m.update(" the spammish repetition here")
m.digest()
'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
m.digest_size
16
m.block_size
64
print m
pensé que print m
me mostraría el resumen MD5 de la frase: "Nadie inspecciona la repetición spammish aquí", sino como un resultado que obtuve esta línea en mi máquina local:
<md5 HASH object @ 01806220>
Extraño, cuando refrescado la página, tengo otra línea:
<md5 HASH object @ 018062E0>
y cada vez que restauro, consigo otro valor:
md5 objeto HASH @ 017F8AE0
md5 objeto HASH @ 01806220
md5 objeto HASH @ 01806360
md5 objeto HASH @ 01806400
md5 objeto HASH @ 01806220
¿Por qué es así? Supongo, lo que tengo en cada línea que fluye "@" no es realmente un digerir. ¿Entonces que es eso? ¿Y cómo puedo mostrar MD5 aquí en este código?
Mi versión es Python Python 2.5 y el marco Actualmente estoy usando es webapp (He descargado junto con el SDK de "Google App Engine")
Solución
El objeto hashlib.hash
no implementa su propio __str__
, por lo que se utiliza la operación predeterminada a cadena, que imprime el nombre de la clase seguido de su id
(dirección).
(Uso .hexdigest()
para obtener la cadena MD5 hexagonal .)
Otros consejos
print m.hexdigest()
upadate: hexdigest()
da otra representación de digest()
. Cada carácter de compendio se transforma en su representación hexadecimal. Puede transformarla con la siguiente función:
def digest_to_hex(chars):
res = ''
for c in chars:
res = res + '%02x' % ord(c)
return res
También puede utilizar el generador de expresion
''.join('%02x' % ord(x) for x in m.digest())
o
m.digest().encode('hex')
Por cierto:. Puede utilizar dir(some_object)
para obtener una lista de sus elementos, y help(some_object)
(en el intérprete interactivo) para obtener más información al respecto