1

我试图理解前几天在 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 摘要:“没有人检查这里的垃圾邮件重复”,但结果我在本地主机上得到了这一行:

<md5 HASH object @ 01806220>

奇怪,当我刷新页面时,我得到了另一行:

<md5 HASH object @ 018062E0>

每次刷新它时,我都会得到另一个值:

md5 哈希对象@017F8AE0

md5 哈希对象@01806220

md5 哈希对象@01806360

md5 哈希对象@01806400

md5 哈希对象@01806220

为什么会这样?我想,我在每一行流动“@”的内容并不是真正的摘要。那这是什么?以及如何在此代码中显示 MD5 摘要?

我的python版本是Python 2.5,我目前使用的框架是webapp(我已经从“Google App Engine”下载了它和SDK)

4

2 回答 2

3

hashlib.hash对象没有实现它自己的__str__,因此使用默认的 to-string 操作,它打印类名,后跟它的id(地址)。

.hexdigest()用于获取十六进制 MD5 字符串。)

于 2010-04-08T06:07:29.837 回答
3
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)(在交互式解释器中)获取有关它的更多信息。

于 2010-04-08T06:07:48.773 回答