2010-02-10 5 views
12

Der hashlib Python-Modul bietet die folgenden Hash-Algorithmen Bauer: md5(), sha1(), sha224(), sha256(), sha384() und sha512().Gibt es einen erheblichen Mehraufwand durch verschiedene Versionen von sha Hashing mit (hashlib Modul)

Angenommen, ich möchte nicht md5 verwenden, gibt es einen großen Unterschied bei der Verwendung, sagen wir, sha1 anstelle von sha512? Ich möchte etwas wie hashlib.shaXXX(hashString).hexdigest() verwenden, aber da es nur zum Zwischenspeichern ist, bin ich mir nicht sicher, dass ich den (eventuellen) zusätzlichen Aufwand von 512 ...

Benötigen Sie diesen Overhead, und wenn ja, wie groß ist es ?

+2

Wenn es für Caching ist, warum benötigen Sie einen sicheren Hash? –

+4

Wenn Sie die verschiedenen Methoden ausprobiert und ihre Leistung gemessen haben, was haben Sie gefunden? –

+2

Was @GregHewgill wahrscheinlich zu sagen hat, ist, dass es ein praktisches Standard-Bibliotheksmodul 'timeit' gibt, das solche Messungen so trivial macht, dass es einfacher ist, Zeit zu nehmen, als danach zu fragen, besonders wenn es von der Kommandozeile aus ausgeführt wird. –

Antwort

18

Warum nicht einfach Benchmarks?

>>> 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 würden Sie Secure Hash für Caching verwenden? Versuchen Sie, die eingebauten Hash-Algorithmen, die wirklich schnell sein sollten und abgestimmt:

>>> s = "asdf" 
>>> hash(s) 
-618826466 
>>> s = "xxx" 
>>> hash(s) 
943435 
>>> hash("xxx") 
943435 

Oder noch besser, verwenden Sie den eingebauten Python Wörterbücher. Vielleicht können Sie uns mehr darüber erzählen, was Sie beim Caching vorhaben.

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 „den eingebauten Python dictinoaries verwendet“ ist, dass Sie die oben vereinfachen :

cache[object_to_cache_as_string] = object_to_cache 

Auf diese Weise kümmert sich Python um das Hashing, also müssen Sie nicht!

In Bezug auf Ihr spezielles Problem können Sie sich auf Python hashable dicts beziehen, um ein Wörterbuch hashbar zu machen. Dann alles, was Sie brauchen würden, zu tun, um das Objekt zu cachen ist:

cache[object_to_cache] = object_to_cache 
+0

Danke, dass Sie sich die Zeit genommen haben, es zu bewerten. Wie viele von Ihnen sagten, brauche ich wahrscheinlich kein sicheres Hashing zum Caching. Grundsätzlich muss ich einen Fingerabdruck von [dem Inhalt] eines Wörterbuchs speichern.Da ich 'hashlib' und' hash() 'nicht direkt in einem Dictionary verwenden kann, habe ich einen String erstellt, der die Elemente dieses Dictionary enthält (mag diesen Ansatz nicht) und dann' hashlib' darauf verwenden. Aber jetzt hast du mich mit der Verwendung der eingebauten Python-Wörterbücher fasziniert, was meinst du damit? – Emilien

+0

Siehe Bearbeiten. Ich hoffe, das löst dein Problem. – sttwister

+0

Durch das Lesen Ihrer Kommentare (alle von Ihnen), erkannte ich, dass ich kein sicheres Hashing verwenden musste, also implementierte ich meinen eigenen "Hashing" -Algorithmus. Da das Wörterbuch immer spezifische Elemente hat und jeder Wert eine Idee hat, erstelle ich aus diesen Ideen eine Zeichenfolge und speichere diese. Danke allen. – Emilien

3

Vielleicht ein naiver Test ... aber es sieht aus wie es hängt davon ab, wie viel Sie Hashing. 2 Blöcke von sha512 sind 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 
+0

Ich habe ähnliche Ergebnisse. Ich denke, das De-Facto-Lernen hier ist, dass md5 und sha1 in der Geschwindigkeit ähnlich sind (ich habe auch md5 mit dieser Methode bewertet) und dann ist sha512 schneller als alle Hashes dazwischen. Verwenden Sie daher sha1 für Geschwindigkeit und sha512 für besseres Hashing. Die anderen ergeben unter dem Gesichtspunkt der Leistung keinen Sinn. –

+0

Ich habe sehr unterschiedliche Ergebnisse, vielleicht die aktuelle Implementierung oder Maschinen sind besser optimiert: 'sha1':' 0.00902104377746582' 'sha224':' '0.007354021072387695' sha256':' '0.007508993148803711' sha384':' '0.004772186279296875' sha512 ':' 0,004884004592895508' – Medorator

Verwandte Themen