2010-02-10 10 views
12

El módulo Python hashlib proporciona los siguientes algoritmos de hash constructores: md5(), sha1(), sha224(), sha256(), sha384(), y sha512().¿Hay una sobrecarga significativa mediante el uso de diferentes versiones de hashing sha (módulo hashlib)

Suponiendo que no deseo usar md5, ¿existe una gran diferencia en el uso de, por ejemplo, sha1 en lugar de sha512? Quiero usar algo como hashlib.shaXXX(hashString).hexdigest(), pero como solo es para el almacenamiento en caché, no estoy seguro de necesitar la (eventual) sobrecarga adicional de 512 ...

¿Existe esta sobrecarga, y si es así, qué tan grande es? ?

+2

Si es para el almacenamiento en caché, ¿por qué necesita un hash seguro? –

+4

Cuando probó los diferentes métodos y midió su rendimiento, ¿qué encontró? –

+2

Lo que probablemente @GregHewgill quiso decir es que hay un conveniente módulo de biblioteca estándar 'timeit' que hace que tales mediciones sean tan triviales que sea más fácil simplemente cronometrar que preguntar sobre ello, especialmente cuando se ejecuta desde la línea de comando. –

Respuesta

18

¿Por qué no basta con compararlo?

>>> 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 

Así que en mi máquina, hash512 es dos veces tan lento como sha1. Pero como dijo GregS, ¿por qué usaría hash seguro para el almacenamiento en caché? Pruebe los algoritmos hash incorporadas, que sean realmente rápido y afinado:

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

O mejor aún, usar los diccionarios de Python incorporada. Tal vez puedas decirnos más sobre lo que planeas almacenar en caché.

EDIT: pienso que usted está tratando de lograr algo como esto:

hash = hashlib.sha1(object_to_cache_as_string).hexdigest() 
cache[hash] = object_to_cache 

Lo que estaba a refferring por "utilizar los dictinoaries Python incorporadas" es que se puede simplificar la anterior :

cache[object_to_cache_as_string] = object_to_cache 

De esta manera, Python se ocupa del hash para que no tenga que hacerlo.

En cuanto a su problema particular, puede consultar Python hashable dicts para hacer un diccionario hashable. Entonces, todo lo que tenía que hacer para almacenar en caché el objeto es:

cache[object_to_cache] = object_to_cache 
+0

Gracias por tomarse el tiempo para compararlo. Como muchos de ustedes dijeron, probablemente no necesite usar hashing seguro para el almacenamiento en caché. Básicamente necesito almacenar una huella digital de [el contenido de] un diccionario.Como no puedo usar 'hashlib' o' hash() 'directamente en un diccionario, estaba construyendo una cadena que contiene los elementos de ese diccionario (no me gusta este enfoque) y luego uso' hashlib' en él. . Pero ahora me has intrigado con "usar los diccionarios integrados de Python", ¿qué quieres decir con eso? – Emilien

+0

Ver edición. Espero que esto resuelva tu problema. – sttwister

+0

Al leer sus comentarios (todos ustedes), me di cuenta de que no necesitaba usar ningún hash seguro, así que implementé mi propio algoritmo "hash". Como el dictionario siempre tiene elementos específicos, y cada valor tiene una idea, creo una cadena a partir de esas ideas y el caché. Gracias a todos. – Emilien

3

Tal vez una prueba ingenua ... pero parece que depende de cuánto está hash. 2 bloques de sha512 es más rápido que 4 bloques de 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

Obtuve resultados similares. Creo que el aprendizaje de facto aquí es que md5 y sha1 son similares en velocidad (también comparé md5 usando este método) y luego sha512 es más rápido que todos los hash intermedios. Por lo tanto, use sha1 para speed y sha512 para mejor hash. Los otros no tienen sentido desde el punto de vista del rendimiento. –

+0

me dieron resultados muy diferentes, tal vez la implementación o máquinas están optimizados mejor actual: 'sha1':' '0.00902104377746582' sha224':' '0.007354021072387695' sha256':' '0.007508993148803711' sha384':' '0.004772186279296875' sha512 ':' 0.004884004592895508' – Medorator

Cuestiones relacionadas