这个Python脚本是MD5摘要吗?
我最近在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 个回答
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)
(在交互式解释器中)来获取更多关于它的信息。
hashlib.hash
这个对象没有自己定义的 __str__
方法,所以当你想把它转换成字符串时,就会使用默认的方式。这种方式会显示类的名称,后面跟着它的 id
(也就是内存地址)。
(你可以使用 .hexdigest()
来获取十六进制的 MD5 字符串。)