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

Is there a significant overhead by using different versions of sha hashing (hashlib module)

hashlibpython模块提供了以下哈希算法构造函数:md5()sha1()sha224()sha256()sha384()sha512()

假设我不想使用MD5,那么在使用sha1而不是sha512方面有很大的区别吗?我想使用像hashlib.shaXXX(hashString).hexdigest()这样的东西,但由于它只是用于缓存,所以我不确定是否需要(最终)512的额外开销…

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


为什么不只是基准测试呢?

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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所说,为什么要使用安全哈希进行缓存?尝试内置哈希算法,该算法应该非常快速和优化:

1
2
3
4
5
6
7
8
>>> s ="asdf"
>>> hash(s)
-618826466
>>> s ="xxx"
>>> hash(s)
943435
>>> hash("xxx")
943435

或者更好的是,使用内置的python字典。也许您可以告诉我们更多关于缓存的计划。

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

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

我在"使用内置的python dictionaries"中重新定义的是,您可以简化上面的内容:

1
cache[object_to_cache_as_string] = object_to_cache

这样,python就可以处理散列了,所以您不必这样做!

关于您的特定问题,您可以参考python hashable dicts,以使字典具有hashable属性。然后,缓存对象所需要做的就是:

1
cache[object_to_cache] = object_to_cache


也许是个幼稚的测试…但看起来这取决于你的哈希值。2块sha512比4块sha256快?

1
2
3
4
5
6
7
8
9
10
11
>>> 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