尝试在python中的文件中存储md5哈希时给出垃圾值

时间:2010-05-04 16:09:46

标签: python

m=md5.new() 
a=10111011
>>> m.update(str(a))
>>> k=m.digest()
>>> k
'\xec\x9d1\x89e\x08\xa1\xc2Y\xf6\xbf6\xfe\xe4\xe2M'
>>> f.write(str(k))
>>> f.flush()

文件f中填充了垃圾值,我无法再次读取以进一步使用散列值。为什么它在python终端上给出了正确的输出时给出了垃圾值?最糟糕的是文件被破坏了..

2 个答案:

答案 0 :(得分:3)

如果您想了解“垃圾”(您的摘要!)来自哪里的更多线索,请尝试print kprint repr(k)

您有一个原始字节字符串。我想你想插入一个hexdigest呢?使用k = m.hexdigest()k = repr(m.digest())并将其写入您的文件。

基本上,您可以选择代表,选择您写入文件的内容。您希望看到以下哪些?

>>> print k
�1���Y�6���M
>>> print repr(k)
'\xec\x9d1\x89e\x08\xa1\xc2Y\xf6\xbf6\xfe\xe4\xe2M'
>>> print k.encode("hex")
ec9d31896508a1c259f6bf36fee4e24d

将完全相同的内容传递给f.write(..),就像打印一样。正如您所看到的,在原始版本中您使用'k'('str(k)'与'k'相同)

答案 1 :(得分:1)

一种可能性是您在Windows上并且未以二进制模式正确打开文件,即'wb'。我们无法分辨,因为您没有告诉我们您如何打开f

另一种可能性是你在使用Python 3(其中str表示unicode),但我认为在这种情况下,当你显示b时,你会看到一个领先的k (并且Python 3的标准库中没有md5模块。)

以正确的方式打开文件,在Mac上使用Python 2.6.4,我将摘要视为

'\x82s\xf9\xa4\x83\x04\x87\xd0\xfdg\xee\xfa\x1f\x05B>'

作为k和文件的内容。顺便说一下,我不知道为什么你会看到不同的东西;我在Python 2.4和2.5中得到了相同的结果。