hashlib
Python模块提供以下哈希算法构造函数:md5()
,sha1()
,sha224()
,sha256()
,sha384()
和{ {1}}。
假设我不想使用md5,那么使用sha1而不是sha512会有很大的不同吗?我想使用类似sha512()
的东西,但因为它只是用于缓存,我不确定我是否需要(最终)额外开销512 ...
这种开销是否存在,如果存在,它有多大?
答案 0 :(得分: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
因此,在我的计算机上,hash512
的速度是sha1
的两倍。但正如GregS所说,为什么要使用安全散列进行缓存?尝试内置哈希算法,这应该非常快速和调整:
>>> 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 dictinoaries”我所做的是你可以简化上述内容:
cache[object_to_cache_as_string] = object_to_cache
通过这种方式,Python可以处理散列,因此您无需使用!
关于您的特定问题,您可以参考Python hashable dicts以使字典可以删除。然后,您需要做的就是缓存对象:
cache[object_to_cache] = object_to_cache
答案 1 :(得分:5)
也许是一个天真的测试...但看起来它取决于你有多少哈希。 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