有人可以告诉我为什么我会得到同一个文件的备用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'
答案 0 :(得分: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
答案 1 :(得分:2)
str(f)
没有提供该文件的内容,它将返回如下内容:
"<open file '480p.m4v', mode 'r' at 0xb7855230>"
但我不确定为什么会这样做。
答案 2 :(得分:0)
正如其他人所说,失败的原因是你正在散列对象的字符串表示。我期望它交替的原因是因为字符串表示包括存储文件对象的内存地址。当你这样做时:
f = open(...)
将该文件对象存储在f
中,指向内存X.当您再次执行相同操作时,将调用open()
并分配更多内存。由于f
仍然指向内存X,因此该内存仍在使用中,而第二个open()
则在Y处分配新内存。但是,只要open()
返回,结果就会分配给f
。现在指向内存X的文件对象悬空并被垃圾收集。下一次调用open()
将重用X中的内存,因为它现在是免费的(这不是保证,但很常见)