1

同じファイルの代替ファイルを取得する理由を誰かに教えてもらえますか?しかし、毎秒同じですか?

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

オブジェクトのアドレスが異なるインスタンス間で明らかに変化しているため、ハッシュが変化していることに気付くでしょう。どうやら、1つのファイルオブジェクトのメモリ位置は、作成された他のインスタンスごとに再利用され、ハッシュが一致するようになります。

ファイルの内容をハッシュするには、次を使用できます。

>>> 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を指しているため、そのメモリは引き続き使用され、2番目は代わりopen()にYに新しいメモリを割り当てます。ただし、が返されるとすぐにopen()、結果はに割り当てられfます。これで、メモリXを指すファイルオブジェクトがぶら下がり、ガベージコレクションされます。次のへの呼び出しopen()は、Xのメモリが現在空いているため、再利用します(これは保証されていませんが、一般的です)

于 2010-12-16T20:09:48.030 に答える