2010-04-08 5 views
1

Я пытаюсь понять этот простой код hashlib в Python, который был дан мне на днях на Stackoverflow:Является ли это дайджестом MD5 в этом скрипте 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 фразу: «Никто не осматривает spammish повторение здесь», но в итоге я получил эту линию на моем локальном хосте:

<md5 HASH object @ 01806220> 

Strange, когда я обновил страницу, я получил еще одну строку:

<md5 HASH object @ 018062E0> 

и каждый раз, когда я обновить его, я получаю еще одно значение:

md5 объект HASH @ 017F8AE0

md5 HASH объект @ 01806220

md5 HASH объект @ 01806360

md5 HASH-объект @ 01806400

md5 HASH-объект @ 01806220

Почему это так? Я думаю, что у меня в каждой строке, текущей «@», на самом деле не дайджест. Тогда что это? И как я могу отобразить дайджест MD5 здесь в этом коде?

Мой питон версия Python 2.5 и структура В настоящее время я использую это веб-приложение (я скачал его вместе с SDK от «Google App Engine»)

ответ

3

Объект hashlib.hash не реализует свой __str__, так используется операция по умолчанию, которая печатает имя класса, а затем его id (адрес).

(Используйте .hexdigest(), чтобы получить строку с шестигранной MD5.)

+0

@ KennyTM: Спасибо, Кенни. Можете ли вы рассказать мне, что такое «объект __str__»? – brilliant

+1

@brilliant: 'x .__ str __()' эквивалентно 'str (x)'. – kennytm

+0

@ KennyTM: Я вижу, спасибо, Кенни !!! – brilliant

3
print m.hexdigest() 

UPADATE: hexdigest() дает другое представление digest(). Каждый символ в дайджесте преобразуется в его шестнадцатеричное представление. Вы можете преобразовать его с помощью следующей функции:

def digest_to_hex(chars): 
    res = '' 
    for c in chars: 
    res = res + '%02x' % ord(c) 
    return res 

Вы можете также использовать expresion генератор

''.join('%02x' % ord(x) for x in m.digest()) 

или

m.digest().encode('hex') 

BTW: Вы можете использовать dir(some_object), чтобы получить список его элементов и help(some_object) (в интерактивном интерпретаторе), чтобы получить дополнительную информацию об этом.

+0

@ Руди: Руди, большое спасибо !!! Не могли бы вы рассказать мне, в чем разница между дайджестом и шестым? – brilliant

+0

hexdigest() дает другое представление digic(). Каждый символ в дайджесте преобразуется в шестнадцатеричное представление. Вы можете преобразовать его с помощью следующей функции: 'Def digest_to_hex (символы): разреша = '' для с в гольцах: Реза = Рез + '% 02x' % ог (с) возвращения res' Вы также можете использовать генератор expresion '' .join (['% 02x'% ord (x) для x в m.digest()]) – Rudi

+1

Я отправляю комментарий как новый тент, потому что я не могу получить код, который будет правильно отображаться в комментарии. – Rudi