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.
El hash one_at_a_time de Jenkins se adapta 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
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]
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 Jenkins ha publicado. Las aplicaciones de esta función hash se encuentran en:
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]
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