Gibt es einen erheblichen Mehraufwand durch die Verwendung unterschiedlicher Versionen von sha-Hashing (hashlib Modul)
Frage
Die hashlib
Python-Modul bietet die folgenden Hash-Algorithmen Bauer: md5()
, sha1()
, sha224()
, sha256()
, sha384()
und sha512()
.
Unter der Annahme, ich will nicht, md5 verwenden, gibt es einen großen Unterschied bei der Verwendung, sagen wir, SHA1 statt sha512? Ich möchte so etwas wie hashlib.shaXXX(hashString).hexdigest()
verwenden, aber da es nur für das Caching ist, ich bin nicht sicher, ich brauche den (eventuellen) zusätzlichen Aufwand von 512 ...
Gibt es diesen Aufwand exist, und wenn ja, wie groß ist es?
Lösung
Warum nicht einfach Benchmark es?
>>> 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
So auf meiner Maschine ist hash512
doppelt so langsam wie sha1
. Aber wie GregS sagte, warum sollten Sie verwenden sicheren Hash für das Caching? Versuchen Sie, die eingebaute Hash-Algorithmen, die wirklich schnell sein sollte und abgestimmt:
>>> s = "asdf"
>>> hash(s)
-618826466
>>> s = "xxx"
>>> hash(s)
943435
>>> hash("xxx")
943435
Oder noch besser, verwenden Sie die eingebaute Python Wörterbücher. Vielleicht können Sie uns mehr darüber erzählen, was Sie vorhaben, auf Caching.
EDIT: Ich denke, dass Sie so etwas zu erreichen versuchen:
hash = hashlib.sha1(object_to_cache_as_string).hexdigest()
cache[hash] = object_to_cache
Was ich refferring durch „verwenden die eingebaute Python dictinoaries“ ist, dass Sie die oben vereinfachen kann:
cache[object_to_cache_as_string] = object_to_cache
Auf diese Weise Python kümmert sich um die Hashing so dass Sie nicht haben!
Ihr spezielles Problem betrifft, könnten Sie sich auf Python hashable dicts um ein Wörterbuch hashable zu machen . Dann alles, was Sie brauchen würden, zu tun, um das Objekt zu cachen ist:
cache[object_to_cache] = object_to_cache
Andere Tipps
Vielleicht ein naiver Test ... aber es sieht aus wie es hängt davon ab, wie viel Sie Hashing. 2 Blocks von sha512 ist schneller als 4 Blöcke von 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