python md5, d.update (strParam) .hexdigest () возвращает NoneType. =, почему? - PullRequest
0 голосов
/ 02 июля 2011
>>> d = md5.new()
>>> d.update('a').hexdigest()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'hexdigest'

это будет работать -

>>> d = md5.new()
>>> d.update('a')
>>> d.hexdigest()
'0cc175b9c0f1b6a831c399e269772661'

есть объяснение укорочения кода на питоне?

Ответы [ 3 ]

6 голосов
/ 02 июля 2011

Вы можете просто сделать:

md5.new('a').hexdigest()

Перефразировано из документации :

new(arg) возвращает новый объект md5.Если присутствует arg, выполняется вызов метода update(arg).


Но md5 устарело.
Вместо этого используйте hashlib.

Изменить:
Есть также проблемы с md5, поэтому в зависимости от ваших целей вы можете использовать более безопасную хеш-функцию, например, SHA-256:

import hashlib
hashlib.sha256('a').hexdigest()

Обратите внимание, что SHA-256 будетЭто займет больше времени, поэтому, если у вас есть ограничения по времени, это может быть не лучшим решением.

3 голосов
/ 02 июля 2011

Вы хотите это:

import hashlib
hashlib.md5('a').hexdigest()

Примечание: не используйте простой MD5 для безопасности.

  • Если вы хэшируете пароли, используйте scrypt или bcrypt.
  • Если вы аутентифицируете сообщение, используйте HMAC.
  • Если вы проверяете целостность файла, рассмотрите SHA2 или новее.
2 голосов
/ 02 июля 2011

Ну, так как обновление не вернулось (возврат по умолчанию в Python = None), вызов update(arg).<anything> должен завершиться неудачей. Иногда библиотеки будут иметь return self в качестве последней строки метода. Если бы это было так, ваш первый пример кода сработал бы.

С помощью точки с запятой вы можете поместить весь код в одну строку:

d = md5.new(); d.update('a'); d.hexdigest()

Но, как правило, это не рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...