hashlib
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
的两倍。但正如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内置字典”是指您可以简化上述内容:
cache[object_to_cache_as_string] = object_to_cache
cache[object_to_cache] = object_to_cache
编辑 - 关于 Python3 的说明
Python 3.3 引入了哈希随机化,这意味着计算出的哈希值可能在不同的进程中不同,因此您不应该依赖计算出的哈希值,除非将 PYTHONHASHSEED
环境变量设置为 0。
参考: - https://docs.python.org/3/reference/datamodel.html#object.hash - https://docs.python.org/3/using/cmdline.html#envvar-PYTHONHASHSEED
hashlib
或hash()
,因此我正在构建一个包含该字典元素的字符串(不喜欢这种方法),然后对其使用hashlib
...但现在你用“使用内置的Python字典”激起了我的好奇心,你是什么意思? - Emilienhash()
在不同实例之间不返回一致的值,因此可能会出现问题。例如,Heroku上的每个“dyno”(例如Linux实例)似乎对相同字符串的hash()
返回不同的结果。它仅在实例内部保持一致。据报道,GAE也具有类似的行为。 - B Robster>>> 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
sha1
:0.00902104377746582
sha224
:0.007354021072387695
sha256
:0.007508993148803711
sha384
:0.004772186279296875
sha512
:0.004884004592895508
- user
timeit
,使得这样的测量如此简单,以至于直接计时比询问更容易,特别是当它从命令行运行时。 - Peter Hansen