替换同一文件的不同shas.为什么?

asc*_*d00 1 python sha

有人能给我一个理由,为什么我得到同一文件的备用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'
Run Code Online (Sandbox Code Playgroud)

Cam*_*ron 8

你得到不同哈希的原因是因为你并没有真正散列文件的内容,只有文件对象的字符串表示.例如:

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

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

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

>>> sha = str(hashlib.sha224(f.read()).hexdigest())    # read() slurps the whole file into a string
Run Code Online (Sandbox Code Playgroud)