Gibt es einen erheblichen Mehraufwand durch die Verwendung unterschiedlicher Versionen von sha-Hashing (hashlib Modul)

StackOverflow https://stackoverflow.com/questions/2241013

  •  19-09-2019
  •  | 
  •  

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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top