@chistya

Из-за чего получается разных хеш?

Добрый день.
Есть следующая функцияция для расчета контрольной суммы:
import hashlib
def hashfile(afile, hasher=hashlib.sha256(), blocksize=65536):
    buf = afile.read(blocksize)
    while len(buf) > 0:
        hasher.update(buf)
        buf = afile.read(blocksize)
    return hasher.hexdigest()

Когда вызываю функцию с аргументами по умолчанию, то хеш всегда разный:
>>> hashfile(open('/home/ch1s7ya/dev/check-files/test/test2', 'rb'))
'a74886ccae8826acdaac6caf886f3f444b783f5e1af9b6fa576e3fcb4fd46c94'
>>> hashfile(open('/home/ch1s7ya/dev/check-files/test/test2', 'rb'))
'a6296b87bf154156094547ac4cdd3515bd0e5c45850806e79d079f034b5ef147'
>>> hashfile(open('/home/ch1s7ya/dev/check-files/test/test2', 'rb'))
'13b0b8daaed3dbbea149e9053bbe141208de3b98570835593792eebfa4c51e34'

Но когда аргумент hasher задаю вручную, то хеш одинаковый:
>>> hashfile(open('/home/ch1s7ya/dev/check-files/test/test1', 'rb'), hashlib.sha256())
'634b027b1b69e1242d40d53e312b3b4ac7710f55be81f289b549446ef6778bee'
>>> hashfile(open('/home/ch1s7ya/dev/check-files/test/test1', 'rb'), hashlib.sha256())
'634b027b1b69e1242d40d53e312b3b4ac7710f55be81f289b549446ef6778bee'
>>> hashfile(open('/home/ch1s7ya/dev/check-files/test/test1', 'rb'), hashlib.sha256())
'634b027b1b69e1242d40d53e312b3b4ac7710f55be81f289b549446ef6778bee'

Чем обосновывается такое поведение?
  • Вопрос задан
  • 264 просмотра
Решения вопроса 1
@deliro
hasher=hashlib.sha256()
Вот эта строчка шарится между вызовами функций, т.к. не является неплоской структурой и передаётся по ссылке. Тебе нужно заменить на вот такое:
import hashlib
def hashfile(afile, hasher=None, blocksize=65536):
    if hasher is None:
        hasher = hashlib.sha256()
    buf = afile.read(blocksize)
    while len(buf) > 0:
        hasher.update(buf)
        buf = afile.read(blocksize)
    return hasher.hexdigest()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы