Как создать отдельные экземпляры хеш-алгоритма в Python?

hashlib содержит реализации алгоритмов хеширования. К сожалению, два последовательных вызова hashlib.sha256() создают не два разных экземпляра SHA256, а один и тот же: при двойном вызове hashlib.sha256() каждый раз будет возвращаться один и тот же объект. Итак, видимо, у нас здесь синглтон

Это плохо во всех ситуациях, когда требуется какой-либо параллелизм. Кроме того, это очень плохо в ситуациях, когда вы хотите предоставить объект хэширования для некоторого алгоритма. В моем случае: тесты терпят неудачу, поскольку один и тот же объект используется повторно вместо создания нового.

Мой вопрос: как мне создать два экземпляра SHA256 (или любого другого алгоритма хеширования)?

Пример:

import hashlib

print(hashlib.sha256())
print(hashlib.sha256())

Это выведет что-то вроде:

<sha256 HASH object @ 0x7fb3611b4710>
<sha256 HASH object @ 0x7fb3611b4710>

person Regis May    schedule 25.02.2019    source источник
comment
Я не могу воспроизвести это. Я получаю два разных объекта <sha256 HASH object @ 0x101f9a260>... можете ли вы предоставить код, который вы используете для определения этого? Я подозреваю, что вы неправильно используете id (скорее, попадаете в слишком распространенную ловушку). Обратите внимание, для меня hashlib.sha256() is hashlib.sha256() возвращает False   -  person juanpa.arrivillaga    schedule 26.02.2019
comment
Это странно. Я также получаю «False», но, похоже, это тот же объект.   -  person Regis May    schedule 26.02.2019
comment
Тогда это не тот же объект. Как я и подозревал, вы печатаете представление объекта, которое включает его id, то есть в этом примере 0x7fb3611b4710, потому что в CPython, как только счетчик ссылок достигает нуля, объект восстанавливается. Объект существует достаточно долго, чтобы его можно было передать в print. Среда выполнения CPython оптимизирует выделение памяти и вполне может повторно использовать память из последнего объекта.   -  person juanpa.arrivillaga    schedule 26.02.2019
comment
Возможный дубликат безымянных объектов Python имеет одинаковый идентификатор   -  person juanpa.arrivillaga    schedule 26.02.2019
comment
Интересно. GC, по-видимому, работает немного по-другому во всех других языках программирования, с которыми я когда-либо имел дело. Большое спасибо за твою помощь!   -  person Regis May    schedule 26.02.2019


Ответы (1)


В вашем первом примере второй хеш-объект создается после того, как ваш первый хэш-объект был собран мусором. Следовательно, они могут иметь один и тот же адрес памяти. В hashlib.sha256() is hashlib.sha256() первый не может быть удален сборщиком мусора, так как он должен быть сравнен первым. Вы можете сохранить хэш-объекты в переменных, чтобы сохранить их живыми:

h1 = hashlib.sha256()
h2 = hashlib.sha256()
print(h1 is h2)

[Output]
False
person Aemyl    schedule 26.02.2019