当前位置: 代码迷 >> python >> 使用不同版本的 sha 散列(hashlib 模块)是否有很大的开销
  详细解决方案

使用不同版本的 sha 散列(hashlib 模块)是否有很大的开销

热度:106   发布时间:2023-06-27 21:58:20.0

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

所以在我的机器上, hash512sha1两倍。 但正如所说,为什么要使用安全哈希进行缓存? 尝试应该非常快速和调整的内置哈希算法:

>>> 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 会处理散列,因此您不必这样做!

关于您的特定问题,您可以参考以使字典可哈希。 然后,您需要做的就是缓存对象:

cache[object_to_cache] = object_to_cache

编辑 - 关于 Python3 的注释

Python 3.3 引入了哈希随机化,这意味着计算的哈希在不同的进程中可能不同,因此您不应依赖计算的哈希,除非将PYTHONHASHSEED环境变量设置为 0。

参考资料: - -

也许是一个幼稚的测试......但看起来这取决于你的散列量。 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