stringtranslate.com

Función hash de Jenkins

Las funciones hash de Jenkins son una familia de funciones hash no criptográficas para claves multibyte diseñadas por Bob Jenkins . La primera se publicó formalmente en 1997.

Las funciones hash

uno a la vez

El hash one_at_a_time de Jenkins se ha adaptado aquí de una página de la WWW de Bob Jenkins, [1] que es una versión ampliada de su artículo del Dr. Dobb . [2] Se creó originalmente para cumplir ciertos requisitos descritos por Colin Plumb, un criptógrafo, pero finalmente no se utilizó. [1]

uint32_t jenkins_one_at_a_time_hash ( const uint8_t * clave , tamaño_t longitud ) { tamaño_t i = 0 ; uint32_t hash = 0 ; mientras ( i != longitud ) { hash += clave [ i ++ ]; hash += hash << 10 ; hash ^= hash >> 6 ; } hash += hash << 3 ; hash ^= hash >> 11 ; hash += hash << 15 ; devolver hash ; }                                                  

Valores hash de muestra para la función hash one_at_a_time .

one_at_a_time ( "a" , 1 ) 0xca2e9442 one_at_a_time ( "El rápido zorro marrón salta sobre el perro perezoso" , 43 ) 0x519e91f5  
Comportamiento de avalancha de Jenkins Hash uno a la vez sobre claves de 3 bytes

El comportamiento de avalancha de este hash se muestra a la derecha.

Cada una de las 24 filas corresponde a un solo bit en la clave de entrada de 3 bytes, y cada una de las 32 columnas corresponde a un bit en el hash de salida. Los colores se eligen en función de qué tan bien afecta el bit de la clave de entrada al bit del hash de salida dado: un cuadrado verde indica un buen comportamiento de mezcla, un cuadrado amarillo un comportamiento de mezcla débil y el rojo indicaría que no hay mezcla. Solo unos pocos bits en el último byte de la clave de entrada están débilmente mezclados con una minoría de bits en el hash de salida.

Las implementaciones estándar del lenguaje de programación Perl anteriores a la versión 5.28 incluían el hash uno a la vez de Jenkins o una variante reforzada del mismo, que se usaba de forma predeterminada. [3] [4]

búsqueda2

La función lookup2 fue un sucesor provisional de one-at-a-time. Es la función a la que se hace referencia como "My Hash" en el artículo de la revista Dr. Dobbs de 1997, aunque ha quedado obsoleta debido a las funciones posteriores que ha publicado Jenkins. Las aplicaciones de esta función hash se encuentran en:

búsqueda3

La función lookup3 consume la entrada en fragmentos de 12 bytes (96 bits). [9] Puede ser adecuada cuando la velocidad es más importante que la simplicidad. Sin embargo, tenga en cuenta que cualquier mejora de velocidad a partir del uso de este hash probablemente solo sea útil para claves grandes, y que la mayor complejidad también puede tener consecuencias en la velocidad, como evitar que un compilador optimizador incorpore la función hash.

La función lookup3 se incorporó al formato de datos jerárquicos 5 como una suma de comprobación para estructuras de datos internas en función de su fuerza y ​​velocidad relativas en comparación con CRC32 y Fletcher32 . [10]

Hash espeluznante

En 2011, Jenkins lanzó una nueva función hash de 128 bits llamada SpookyHash. [11] SpookyHash es significativamente más rápido que lookup3.

Ejemplo para V2 (little-endian x64):

El método corto para menos de 192 bytes (43 bytes):

 Hash128("El rápido zorro marrón salta sobre el perro perezoso") 2b12e846aa0693c71d367e742407341b

El método estándar para más de 191 bytes (219 bytes):

 Hash128("El rápido zorro marrón salta sobre el perro perezoso El rápido zorro marrón salta sobre el perro perezoso El rápido zorro marrón salta sobre el perro perezoso El rápido zorro marrón salta sobre el perro perezoso El rápido zorro marrón salta sobre el perro perezoso") f1b71c6ac5af39e7b69363a60dd29c49

Véase también

Referencias

  1. ^ ab Jenkins, Bob (3 de noviembre de 2013). "Una función hash para la búsqueda en tablas hash" . Consultado el 9 de febrero de 2018 .
  2. ^ Jenkins, Bob (septiembre de 1997). "Funciones hash". Diario del Dr. Dobb .
  3. ^ "RFC: perlfeaturedelta": "algoritmo hash uno a la vez... [se agregó en la versión] 5.8.0"
  4. ^ "perl: hv_func.h"
  5. ^ Dillinger, Peter C.; Manolios, Panagiotis (2004). Verificación rápida y precisa de estados de bits para SPIN . Proc. 11th International SPIN Workshop. págs. 57–75. CiteSeerX 10.1.1.4.6765 . 
  6. ^ Neira Ayuso, Pablo (2006). "El sistema de rastreo de conexiones de Netfilter" (PDF) . ;login: . 31 (3).
  7. ^ Bar-Yosef, Noa; Wool, Avishai (2007). Ataques de complejidad algorítmica remota contra tablas hash aleatorias Proc. Conferencia Internacional sobre Seguridad y Criptografía (SECRYPT) (PDF) . págs. 117–124.
  8. ^ Irving, Geoffrey; Donkers, Jeroen; Uiterwijk, Jos. "Resolver kalah" (PDF) . Revista ICGA .
  9. ^ Jenkins, Bob. "lookup3.c source code" (código fuente de lookup3.c) . Consultado el 16 de abril de 2009 .
  10. ^ Koziol, Quincey. «[svn-r12661] Descripción: · HDFGroup/hdf5@d3a12e1» . Consultado el 18 de julio de 2023 .
  11. ^ Jenkins, Bob. "SpookyHash: un hash no criptográfico de 128 bits" . Consultado el 29 de enero de 2012 .