使用不同版本的sha散列(hashlib模块)会产生很大的开销吗

Emi*_*ien 14 python hash hashlib

hashlibPython模块提供了以下的散列算法的构造:md5(),sha1(),sha224(),sha256(),sha384(),和sha512().

假设我不想使用md5,那么使用sha1而不是sha512会有很大的不同吗?我想使用类似的东西hashlib.shaXXX(hashString).hexdigest(),但因为它只是用于缓存,我不确定我需要(最终)额外的512开销......

是否存在这种开销,如果存在,它有多大?

stt*_*ter 18

为什么不只是基准呢?

>>> 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
Run Code Online (Sandbox Code Playgroud)

所以在我的机器上,hash512速度是它的两倍sha1.但正如GregS所说,为什么你会使用安全哈希进行缓存?尝试内置的哈希算法应该非常快速和调整:

>>> s = "asdf"
>>> hash(s)
-618826466
>>> s = "xxx"
>>> hash(s)
943435
>>> hash("xxx")
943435
Run Code Online (Sandbox Code Playgroud)

或者更好的是,使用内置的Python词典.也许你可以告诉我们你计划缓存的更多信息.

编辑: 我在想你正在努力实现这样的目标:

hash = hashlib.sha1(object_to_cache_as_string).hexdigest()
cache[hash] = object_to_cache
Run Code Online (Sandbox Code Playgroud)

通过"使用内置的Python dictinoaries"我所做的是你可以简化上面的内容:

cache[object_to_cache_as_string] = object_to_cache
Run Code Online (Sandbox Code Playgroud)

通过这种方式,Python可以处理散列,因此您不必这样做!

关于您的特定问题,您可以参考Python hashable dicts以使字典可以清除.然后,您需要做的就是缓存对象:

cache[object_to_cache] = object_to_cache
Run Code Online (Sandbox Code Playgroud)

  • 任何看过这个答案的建议是使用hash()而不是hashlib进行非加密散列:请记住,在Python 3和Python 2的一些实现中,`hash()`不会在不同的实例中返回一致的值,所以如果您在分布式平台上运行并尝试生成缓存键或类似的东西,则可能会出现问题.例如,Heroku上的每个"dyno"(如Linux实例)似乎在同一个字符串上为`hash()`返回不同的结果.它只在实例内部一致.据报道,GAE也有类似的行为. (9认同)

Mat*_*ttH 5

也许是一个天真的测试...但看起来它取决于你有多少哈希.sha512的2个块比sha256的4个块快?

>>> 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
Run Code Online (Sandbox Code Playgroud)