È un digest MD5 in questo script Python?
Domanda
Sto cercando di capire questo semplice codice hashlib in Python che è stato dato a me l'altro giorno su 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
Ho pensato che print m
mi avrebbe mostrato l'MD5 digest della frase: "Nessuno ispeziona la ripetizione spammish qui", ma come risultato ho avuto questa linea sul mio host locale:
<md5 HASH object @ 01806220>
Strano, quando ho aggiornato la pagina, ho ottenuto un'altra linea:
<md5 HASH object @ 018062E0>
e ogni volta quando mi rinfresco, ottengo un altro valore:
oggetto hash MD5 @ 017F8AE0
oggetto hash MD5 @ 01.806.220
oggetto hash MD5 @ 01.806.360
oggetto hash MD5 @ 01.806.400
oggetto hash MD5 @ 01.806.220
Perché è così? Credo, quello che ho in ogni riga che scorre "@" non è davvero un digerire. Allora, che cosa è? E come posso visualizzare MD5 digest qui in questo codice?
La mia versione Python è Python 2.5 e il quadro Attualmente sto usando è webapp (ho scaricato insieme a SDK da "Google App Engine")
Soluzione
L'oggetto hashlib.hash
non implementa un proprio __str__
, quindi viene utilizzata l'operazione predefinita a stringa, che stampa il nome della classe seguito dal suo id
(indirizzo).
(Usa .hexdigest()
per ottenere la stringa esadecimale MD5 .)
Altri suggerimenti
print m.hexdigest()
UPADATE: hexdigest()
dà un'altra rappresentazione di digest()
. Ogni personaggio di digest si trasforma in sua rappresentazione esadecimale. È possibile trasformare con la seguente funzione:
def digest_to_hex(chars):
res = ''
for c in chars:
res = res + '%02x' % ord(c)
return res
È inoltre possibile utilizzare il generatore expresion
''.join('%02x' % ord(x) for x in m.digest())
o
m.digest().encode('hex')
A proposito:. È possibile utilizzare dir(some_object)
per ottenere un elenco dei suoi elementi, e help(some_object)
(nell'interprete interattivo) per ottenere maggiori informazioni a riguardo