1

有人可以给我一个为什么我得到同一文件的备用 shas 的理由吗?但每一秒沙都一样吗?

>>> f = open('480p.m4v')    
>>> sha1 = str(hashlib.sha224(str(f)).hexdigest())
>>> sha1
'4aa8cf11b849b77f608302fdcdad3703dce54c33ba4bac80fa0ef700'
>>> f.close()
>>> f = open('480p.m4v')
>>> sha2 = str(hashlib.sha224(str(f)).hexdigest())
>>> f.close()
>>> sha2
'ae60e45200c960f79d25049ef0135709ca6edf246b3f9e53cd084e58'
>>> f = open('480p.m4v')
>>> sha3 = str(hashlib.sha224(str(f)).hexdigest())
>>> f.close()
>>> sha3
'4aa8cf11b849b77f608302fdcdad3703dce54c33ba4bac80fa0ef700'
>>> f = open('480p.m4v')
>>> sha4 = str(hashlib.sha224(str(f)).hexdigest())
>>> f.close()
>>> sha4
'ae60e45200c960f79d25049ef0135709ca6edf246b3f9e53cd084e58'
>>> f = open('480p.m4v')
>>> sha5 = str(hashlib.sha224(str(f)).hexdigest())
>>> f.close()
>>> sha5
'4aa8cf11b849b77f608302fdcdad3703dce54c33ba4bac80fa0ef700'
>>> f = open('480p.m4v')
>>> sha6 = str(hashlib.sha224(str(f)).hexdigest())
>>> f.close()
>>> sha6
'ae60e45200c960f79d25049ef0135709ca6edf246b3f9e53cd084e58'
4

3 回答 3

8

您获得不同哈希的原因是因为您并没有真正对文件的内容进行哈希处理,而只是对文件对象的字符串表示进行哈希处理。例如:

>>> f = open('480p.m4v')
>>> print str(f)
<open file '480p.m4v', mode 'r' at 0x0224C9D0>

您会注意到对象的地址在不同的实例之间显然发生了变化,从而导致哈希值发生了变化。显然,一个文件对象的内存位置被每隔一秒创建的其他实例重用,导致哈希值一​​致。

要散列文件的内容,您可以使用以下命令:

>>> sha = str(hashlib.sha224(f.read()).hexdigest())    # read() slurps the whole file into a string
于 2010-12-16T20:00:03.067 回答
2

str(f)不给你文件的内容,它会返回类似:

"<open file '480p.m4v', mode 'r' at 0xb7855230>"

不过,我不确定为什么会这样。

于 2010-12-16T19:59:39.483 回答
0

正如其他人所说,失败的原因是您正在散列对象的字符串表示形式。我希望它交替的原因是因为字符串表示包括文件对象存储的内存地址。当你这样做时:

f = open(...)

您将该文件对象存储在 中f,指向内存 X。当您再次执行相同操作时,open()将调用并分配更多内存。由于f仍然指向内存 X,因此该内存仍在使用中,而第二个内存则open()在 Y 处分配新内存。但是,一旦open()返回结果就分配给f. 现在指向内存 X 的文件对象悬空并被垃圾收集。下一次调用open()将重用 X 处的内存,因为它现在是免费的(这不能保证,但很常见)

于 2010-12-16T20:09:48.030 回答