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")

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top