Это дайджест MD5 в этом сценарии Python?
Вопрос
Я пытаюсь понять этот простой код Hashlib в Python, который был передан мне на днях на стойке:
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
я думал что print m
Покажет мне дайджест MD5 фразы: «Никто не проверяет повторение« Спамис »здесь», но в результате я получил эту линию на моем местном хосте:
<md5 HASH object @ 01806220>
Странно, когда я освежал страницу, я получил еще одну строку:
<md5 HASH object @ 018062E0>
И каждый раз, когда я его обновляю, я получаю еще одну ценность:
MD5 Hash Object @ 017f8ae0
MD5 Hash Object @ 01806220
MD5 Hash Object @ 01806360
MD5 Hash Object @ 01806400
MD5 Hash Object @ 01806220
Почему это так? Я думаю, что у меня в каждой линии течет «@», не совсем дайджест. Тогда что это? И как я могу отобразить дайджест MD5 здесь в этом коде?
Моя версия Python - python 2.5, а рамки, которые я использую, это WebApp (я скачал его вместе с SDK из "Google App Engine")
Решение
То hashlib.hash
Объект не реализует свои собственные __str__
, поэтому используется операция по умолчанию для строки, которая печатает имя класса, за которым следует его id
(адрес).
(Использовать .hexdigest()
Чтобы получить строку Hex MD5.)
Другие советы
print m.hexdigest()
Upadate: hexdigest()
дает другое представление о digest()
. Отказ Каждый персонаж в дайджесте преобразуется в его шестигранное представление. Вы можете преобразовать его со следующей функцией:
def digest_to_hex(chars):
res = ''
for c in chars:
res = res + '%02x' % ord(c)
return res
Вы также можете использовать Expresion Generator
''.join('%02x' % ord(x) for x in m.digest())
или
m.digest().encode('hex')
Кстати: вы можете использовать dir(some_object)
получить список его элементов и help(some_object)
(в интерактивном переводчике) получить больше информации об этом.