Существуют ли значительные накладные расходы при использовании разных версий sha-хеширования (модуль hashlib)
Вопрос
А hashlib
Модуль Python предоставляет следующие конструкторы алгоритмов хеширования: md5()
, sha1()
, sha224()
, sha256()
, sha384()
, и sha512()
.
Предположим, я не хочу использовать md5, есть ли большая разница в использовании, скажем, sha1 вместо sha512?Я хочу использовать что-то вроде hashlib.shaXXX(hashString).hexdigest()
, но поскольку это предназначено только для кэширования, я не уверен, что мне нужны (возможные) дополнительные накладные расходы в размере 512...
Существуют ли эти накладные расходы, и если да, то насколько они велики?
Решение
Почему бы просто не сравнить это?
>>> 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
.Но ГрегС спросил, зачем вам использовать безопасный хеш для кеширования?Попробуйте встроенные алгоритмы хеширования, которые должны быть очень быстрыми и настроенными:
>>> s = "asdf"
>>> hash(s)
-618826466
>>> s = "xxx"
>>> hash(s)
943435
>>> hash("xxx")
943435
Или, что еще лучше, используйте встроенные словари Python.Возможно, вы расскажете нам больше о том, что вы планируете кэшировать.
РЕДАКТИРОВАТЬ:Я думаю, что вы пытаетесь добиться чего-то вроде этого:
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 чтобы сделать словарь хешируемым.Затем все, что вам нужно сделать для кэширования объекта, это:
cache[object_to_cache] = object_to_cache
Другие советы
Возможно, наивный тест...но похоже, что это зависит от того, сколько вы хэшируете.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