Это дайджест MD5 в этом скрипте Python? - PullRequest
1 голос
/ 08 апреля 2010

Я пытаюсь понять этот простой код hashlib в Python, который был дан мне на днях в 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

Я думал, что print m покажет мне дайджест фразы MD5: «Никто не проверяет повторение спама здесь», но в результате я получил эту строку на своем локальном хосте:

<md5 HASH object @ 01806220>

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

<md5 HASH object @ 018062E0>

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

md5 объект HASH @ 017F8AE0

md5 объект HASH @ 01806220

md5 HASHobject @ 01806360

md5 HASH объект @ 01806400

md5 HASH объект @ 01806220

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

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

Ответы [ 2 ]

3 голосов
/ 08 апреля 2010
print m.hexdigest()

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

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

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

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

или

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

Кстати: вы можете использовать dir(some_object) для получения списка его элементов и help(some_object) (в интерактивном переводчике) для получения дополнительной информации о нем.

3 голосов
/ 08 апреля 2010

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

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

...