É um MD5 Digest neste script Python?
Pergunta
Estou tentando entender esse código de hashlib simples em Python que me foi dado outro dia no 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
Eu pensei que print m
Mostrava -me a digestão do MD5 da frase: "Ninguém inspeciona a repetição de spam aqui", mas, como resultado, recebi essa linha no meu anfitrião local:
<md5 HASH object @ 01806220>
Estranho, quando refrescei a página, recebi outra linha:
<md5 HASH object @ 018062E0>
E toda vez que quando eu refresco, recebo outro valor:
objeto de hash md5 @ 017f8ae0
objeto de hash md5 @ 01806220
objeto de hash md5 @ 01806360
objeto de hash md5 @ 01806400
objeto de hash md5 @ 01806220
Por que é tão? Eu acho que o que tenho em cada linha fluindo "@" não é realmente um resumo. Então, o que é? E como posso exibir o MD5 Digest aqui neste código?
Minha versão Python é Python 2.5 e a estrutura que estou usando atualmente é o WebApp (eu baixei junto com o SDK do "Google App Engine")
Solução
o hashlib.hash
objeto não implementa seu próprio __str__
, então é usada a operação padrão para string, que imprime o nome da classe seguido por seu id
(Morada).
(Usar .hexdigest()
Para obter a string hexadecimal MD5.)
Outras dicas
print m.hexdigest()
Upadate: hexdigest()
dá outra representação de digest()
. Todo personagem em Digest é transformado em sua representação hexadecimal. Você pode transformá -lo com a seguinte função:
def digest_to_hex(chars):
res = ''
for c in chars:
res = res + '%02x' % ord(c)
return res
Você também pode usar a expresso do gerador
''.join('%02x' % ord(x) for x in m.digest())
ou
m.digest().encode('hex')
Btw: você pode usar dir(some_object)
para obter uma lista de seus elementos e help(some_object)
(no intérprete interativo) para obter mais informações sobre isso.