替换同一文件的不同sha。为什么?

2024-09-30 20:32:26 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能给我一个理由为什么我得到同一个文件的替代sha?但每一秒都是一样的吗?在

>>> 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'

Tags: closeopensha1hashlib理由strhexdigestsha3
3条回答

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

f = open(...)

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

得到不同哈希值的原因是,实际上并不是对文件内容进行哈希处理,而是对file对象的字符串表示进行哈希处理。例如:

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

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

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

^{pr2}$

str(f)不提供文件的内容,它将返回如下内容:

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

不过,我不知道为什么会交替出现。在

相关问题 更多 >