Python 使用不同版本的sha哈希(hashlib模块)是否会带来很大的开销

Python 使用不同版本的sha哈希(hashlib模块)是否会带来很大的开销,python,hash,hashlib,Python,Hash,Hashlib,Python模块提供以下哈希算法构造函数:md5()、sha1()、sha224()、sha256()、sha384()和sha512() 假设我不想使用md5,那么使用sha1而不是sha512会有很大区别吗?我想使用类似于hashlib.shaXXX(hashString.hexdigest())的东西,但由于它只是用于缓存,我不确定我是否需要(最终)512的额外开销 这种开销存在吗?如果存在,它有多大?为什么不直接对其进行基准测试 >>> def sha1(s): ...

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负责哈希,所以您不必这样做

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

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

如果是为了缓存,为什么需要一个安全的散列?当你尝试不同的方法并测量它们的性能时,你发现了什么?@GregHewgill可能想说的是,有一个方便的标准库模块
timeit
,它使得这样的测量非常简单,只需计时比询问更容易,特别是当它从命令行运行时。@GregS您会使用什么来代替安全哈希?我需要一个python dict的指纹(包含搜索参数),这样我就可以确定(1)这个搜索之前是否已经完成,以及(2,如果是新的搜索)搜索结果是否可以显示。因为我从交易所学到了一些东西,所以我对这个问题投了赞成票。谢谢你花时间对它进行基准测试。正如你们中的许多人所说,我可能不需要为缓存使用安全哈希。基本上,我需要存储字典[内容]的指纹。由于我不能直接在字典上使用
hashlib
hash()
,因此我正在构建一个包含该字典元素的字符串(不喜欢这种方法),然后在其上使用
hashlib
。。。但是现在你对“使用内置Python字典”很感兴趣,这是什么意思?通过阅读你的评论(你们所有人),我意识到我不需要使用任何安全的哈希,所以我实现了我自己的“哈希”算法。因为词汇表总是有特定的元素,每个值都有一个想法,所以我从这些想法中创建一个字符串并缓存它。谢谢大家。如果有人看到这个答案的建议,使用hash()而不是hashlib进行非加密哈希:请记住,在Python3和Python2的一些实现中,
hash()
不会在不同实例之间返回一致的值,因此如果您在分布式平台上运行并试图生成缓存密钥或类似的内容,则可能会出现问题。例如,Heroku上的每个“dyno”(如linux实例)似乎都会为同一字符串上的
hash()
返回不同的结果。它只在实例本身内部保持一致。据报道GAE也有类似的行为,我也得到了类似的结果。我认为这里事实上学到的是md5和sha1在速度上是相似的(我也使用这种方法对md5进行了基准测试),然后sha512比这两者之间的所有哈希都快。因此,使用sha1可以提高速度,使用sha512可以提高散列效果。从性能的角度来看,其他的都没有意义。我得到了非常不同的结果,可能当前的实现或机器优化得更好:
sha1
0.00902104377746582
sha224
0.007354021072387695
sha256
0.007508993148803711
sha384:
0.00477218627926875
sha512
0.004884004592895508