Est-ce un résumé MD5 dans ce script Python?
Question
Je suis en train de comprendre ce simple code hashlib en Python qui m'a été donné l'autre jour sur 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
Je pensais que print m
me montrer le MD5 de la phrase: « Personne n'inspecte la répétition spammish ici », mais par conséquent, je suis arrivé cette ligne sur mon hôte local:
<md5 HASH object @ 01806220>
Etrange, quand je rafraîchi la page, je suis une autre ligne:
<md5 HASH object @ 018062E0>
et chaque fois que je le rafraîchir, je reçois une autre valeur:
md5 objet HASH @ 017F8AE0
md5 objet HASH @ 01806220
md5 objet HASH @ 01806360
md5 objet HASH @ 01806400
md5 objet HASH @ 01806220
Pourquoi est-il? Je suppose que ce que j'ai dans chaque ligne qui coule « @ » est pas vraiment un condensé. Alors qu'est-ce que c'est? Et comment puis-je afficher ici MD5 dans ce code?
Ma version python est Python 2.5 et le cadre que je suis actuellement en utilisant est webapp (je l'ai téléchargé avec le SDK de "Google App Engine")
La solution
L'objet hashlib.hash
ne met pas en œuvre son propre __str__
, l'opération par défaut à chaîne est utilisée, qui imprime le nom de la classe suivie par son id
(adresse).
(Utilisez .hexdigest()
pour obtenir la chaîne MD5 hexagonale .)
Autres conseils
print m.hexdigest()
UPADATE: hexdigest()
donne une autre représentation de digest()
. Chaque caractère condensé est transformé en sa représentation hexagonale. Vous pouvez le transformer avec la fonction suivante:
def digest_to_hex(chars):
res = ''
for c in chars:
res = res + '%02x' % ord(c)
return res
Vous pouvez également utiliser le générateur expresion
''.join('%02x' % ord(x) for x in m.digest())
ou
m.digest().encode('hex')
BTW:. Vous pouvez utiliser dir(some_object)
pour obtenir une liste de ses éléments, et help(some_object)
(dans l'interpréteur interactif) pour obtenir plus d'informations à ce sujet