чередовать разные шас одного и того же файла. Зачем? - PullRequest
1 голос
/ 16 декабря 2010

Может кто-нибудь дать мне причину, почему я получаю альтернативные шас того же файла? но то же самое для каждого второго ша?

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

Ответы [ 3 ]

8 голосов
/ 16 декабря 2010

Причина, по которой вы получаете разные хэши, заключается в том, что вы на самом деле не хэшируете содержимое файла, а только строковое представление объекта файла.Например:

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

Вы заметите, что адрес объекта, очевидно, изменяется между различными экземплярами, вызывая изменение хеша.Очевидно, место в памяти одного файлового объекта повторно используется каждым вторым созданным экземпляром, в результате чего хэши совпадают.

Чтобы хэшировать содержимое файла, вы можете использовать это:

2 голосов
/ 16 декабря 2010

str(f) не дает вам содержимое файла, оно возвращает что-то вроде:

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

Хотя я не уверен, почему это чередуется.

0 голосов
/ 16 декабря 2010

Как говорили другие, причина этого заключается в том, что вы хэшируете строковое представление объекта.Я ожидаю, что причина его чередования заключается в том, что строковое представление содержит адрес памяти, по которой хранится объект файла.Когда вы делаете:

f = open(...)

, вы сохраняете этот файловый объект в f, указывая на память X. Когда вы делаете то же самое снова, вызывается open() и выделяется больше памяти.Поскольку f все еще указывает на память X, эта память остается в использовании, а вторая open() выделяет новую память вместо Y.Однако, как только open() вернется, результат присваивается f.Теперь объект файла, указывающий на память X, болтается и собирается мусором.Следующий вызов open() будет повторно использовать память в X, так как она теперь свободна (это не гарантируется, но часто встречается)

...