Существуют ли значительные издержки при использовании различных версий хэширования (модуль hashlib) - PullRequest
14 голосов
/ 11 февраля 2010

Модуль Python hashlib предоставляет следующие конструкторы хеш-алгоритмов: md5(), sha1(), sha224(), sha256(), sha384() и sha512().

Предполагая, что я не хочу использовать md5, есть большая разница в использовании, скажем, sha1 вместо sha512? Я хочу использовать что-то вроде hashlib.shaXXX(hashString).hexdigest(), но поскольку это только для кеширования, я не уверен, что мне нужны (возможные) дополнительные издержки 512 ...

Существуют ли эти издержки, и если да, то насколько они велики?

Ответы [ 2 ]

18 голосов
/ 11 февраля 2010

Почему бы просто не сравнить его?

>>> def sha1(s):
...     return hashlib.sha1(s).hexdigest()
...
>>> def sha512(s):
...     return hashlib.sha512(s).hexdigest()
...
>>> t1 = timeit.Timer("sha1('asdf' * 100)", "from __main__ import sha1")
>>> t512 = timeit.Timer("sha512('asdf' * 100)", "from __main__ import sha512")
>>> t1.timeit()
3.2463729381561279
>>> t512.timeit()
6.5079669952392578

Итак, на моей машине hash512 в два раза медленнее, чем sha1. Но, как сказал GregS , зачем вам использовать безопасный хеш для кэширования? Попробуйте встроенные алгоритмы хеширования, которые должны быть очень быстрыми и настроенными:

>>> s = "asdf"
>>> hash(s)
-618826466
>>> s = "xxx"
>>> hash(s)
943435
>>> hash("xxx")
943435

Или, что еще лучше, используйте встроенные словари Python. Может быть, вы можете рассказать нам больше о том, что вы планируете кэшировать.

EDIT: Я думаю, что вы пытаетесь достичь чего-то вроде этого:

hash = hashlib.sha1(object_to_cache_as_string).hexdigest()
cache[hash] = object_to_cache

Что я имел в виду, «используя встроенные словари Python», так это то, что вы можете упростить вышесказанное:

cache[object_to_cache_as_string] = object_to_cache

Таким образом, Python заботится о хешировании, поэтому вам не нужно!

Что касается вашей конкретной проблемы, вы можете обратиться к Python hashable dicts , чтобы сделать словарь хэшируемым. Затем все, что вам нужно сделать для кэширования объекта:

cache[object_to_cache] = object_to_cache
5 голосов
/ 11 февраля 2010

Возможно, наивный тест ... но похоже, это зависит от того, сколько вы хэшируете 2 блока sha512 быстрее чем 4 блока sha256?

>>> import timeit
>>> import hashlib
>>> for sha in [ x for x in dir(hashlib) if x.startswith('sha') ]:
...   t = timeit.Timer("hashlib.%s(data).hexdigest()" % sha,"import hashlib; data=open('/dev/urandom','r').read(1024)")
...   print sha + "\t" + repr(t.timeit(1000))
...
sha1    0.0084478855133056641
sha224  0.034898042678833008
sha256  0.034902095794677734
sha384  0.01980900764465332
sha512  0.019846916198730469
...