这个Python脚本是MD5摘要吗?

1 投票
2 回答
1534 浏览
提问于 2025-04-15 21:21

我最近在Stackoverflow上看到了一段简单的Python代码,使用了hashlib库,我想搞明白它是怎么回事:

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摘要:“Nobody inspects the spammish repetition here”,但结果我在本地看到的是这一行:

<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”下载的)

2 个回答

3
print m.hexdigest()

更新:hexdigest()digest() 的另一种表示方式。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

hashlib.hash 这个对象没有自己定义的 __str__ 方法,所以当你想把它转换成字符串时,就会使用默认的方式。这种方式会显示类的名称,后面跟着它的 id(也就是内存地址)。

(你可以使用 .hexdigest() 来获取十六进制的 MD5 字符串。)

撰写回答