Skip to main content
 首页 » 编程设计

python之交替使用同一文件的不同 shas。为什么

2025年05月04日9kevingrace

有人能告诉我为什么我得到同一个文件的备用 shas 吗?但是每秒 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' 

请您参考如下方法:

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

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