En matemáticas y computación , el hash universal (en un algoritmo o estructura de datos aleatorios ) se refiere a seleccionar una función hash al azar de una familia de funciones hash con una determinada propiedad matemática (consulte la definición a continuación). Esto garantiza un número bajo de colisiones en expectativa , incluso si los datos son elegidos por un adversario. Se conocen muchas familias universales (para hash de números enteros, vectores, cadenas) y su evaluación suele ser muy eficiente. El hash universal tiene numerosos usos en informática, por ejemplo, en implementaciones de tablas hash , algoritmos aleatorios y criptografía .
Introducción
Supongamos que queremos mapear claves de algún universo dentro contenedores (etiquetados ). El algoritmo tendrá que manejar algún conjunto de datos. de claves, que no se conocen de antemano. Por lo general, el objetivo del hash es obtener un número bajo de colisiones (claves deque aterrizan en el mismo contenedor). Una función hash determinista no puede ofrecer ninguna garantía en un entorno adverso si el tamaño de es mayor que , ya que el adversario puede elegir para ser precisamente la preimagen de una papelera. Esto significa que todas las claves de datos caen en el mismo contenedor, lo que hace que el hash sea inútil. Además, una función hash determinista no permite la repetición : a veces los datos de entrada resultan ser malos para la función hash (por ejemplo, hay demasiadas colisiones), por lo que a uno le gustaría cambiar la función hash.
La solución a estos problemas es elegir una función al azar de una familia de funciones hash. Una familia de funcionesse llama familia universal si,.
En otras palabras, dos claves cualesquiera del universo chocan con la probabilidad a lo sumo cuando la función hash se extrae al azar de . Esta es exactamente la probabilidad de colisión que esperaríamos si la función hash asignara códigos hash verdaderamente aleatorios a cada tecla. A veces, la definición se relaja para permitir la probabilidad de colisión.. Este concepto fue introducido por Carter y Wegman [1] en 1977, y ha encontrado numerosas aplicaciones en la informática (ver, por ejemplo, [2] ). Si tenemos un límite superior de sobre la probabilidad de colisión, decimos que tenemos -casi universalidad.
Muchas familias universales, pero no todas, tienen la siguiente propiedad de diferencia uniforme más fuerte :
- , Cuándo se extrae al azar de la familia , la diferencia se distribuye uniformemente en .
Tenga en cuenta que la definición de universalidad solo se ocupa de si , que cuenta las colisiones. La propiedad de diferencia uniforme es más fuerte.
(De manera similar, una familia universal puede ser XOR universal si , el valor se distribuye uniformemente en dónde es la operación exclusiva de bit a bit. Esto solo es posible si es una potencia de dos.)
Una condición aún más fuerte es la independencia por pares : tenemos esta propiedad cuando tenemos la probabilidad de que aplicará hash a cualquier par de valores hash es como si fueran perfectamente aleatorios: . La independencia por pares a veces se denomina universalidad fuerte.
Otra propiedad es la uniformidad. Decimos que una familia es uniforme si todos los valores hash son igualmente probables: para cualquier valor hash . La universalidad no implica uniformidad. Sin embargo, una fuerte universalidad implica uniformidad.
Dada una familia con la propiedad de distancia uniforme, se puede producir una familia hash por pares independiente o fuertemente universal agregando una constante aleatoria distribuida uniformemente con valores en a las funciones hash. (Del mismo modo, sies una potencia de dos, podemos lograr independencia por pares de una familia hash universal XOR haciendo una exclusiva o con una constante aleatoria distribuida uniformemente.) Dado que un cambio por una constante a veces es irrelevante en aplicaciones (por ejemplo, tablas hash), una distinción cuidadosa entre la propiedad de distancia uniforme e independiente por pares a veces no se hace. [3]
Para algunas aplicaciones (como las tablas hash), es importante que los bits menos significativos de los valores hash también sean universales. Cuando una familia es fuertemente universal, esto está garantizado: si es una familia fuertemente universal con , luego la familia hizo de las funciones para todos también es fuertemente universal para . Desafortunadamente, no ocurre lo mismo con las familias (meramente) universales. Por ejemplo, la familia hecha de la función de identidad es claramente universal, pero la familia hecha de la función deja de ser universal.
UMAC y Poly1305-AES y varios otros algoritmos de código de autenticación de mensajes se basan en hash universal. [4] [5] En tales aplicaciones, el software elige una nueva función hash para cada mensaje, basándose en un nonce único para ese mensaje.
Varias implementaciones de tablas hash se basan en hash universal. En tales aplicaciones, normalmente el software elige una nueva función hash sólo después de notar que han colisionado "demasiadas" teclas; hasta entonces, la misma función hash se sigue utilizando una y otra vez. (Algunos esquemas de resolución de colisiones, como el hash dinámico perfecto , eligen una nueva función hash cada vez que hay una colisión. Otros esquemas de resolución de colisiones, como el hash de cuco y el hash de 2 opciones , permiten varias colisiones antes de elegir una nueva función de hash ). En [6] se encuentra un estudio de las funciones hash universales y fuertemente universales más rápidas conocidas para números enteros, vectores y cadenas. [6]
Garantías matemáticas
Para cualquier conjunto fijo de llaves, el uso de una familia universal garantiza las siguientes propiedades.
- Para cualquier fijo en , el número esperado de llaves en el contenedor es . Al implementar tablas hash por encadenamiento , este número es proporcional al tiempo de ejecución esperado de una operación que involucra la clave (por ejemplo, una consulta, inserción o eliminación).
- El número esperado de pares de claves en con que chocan) está delimitado por encima de , que es de orden . Cuando el número de contenedores, se elige lineal en (es decir, está determinada por una función en ), el número esperado de colisiones es . Al entrar en contenedores, no hay colisiones en absoluto con una probabilidad de al menos la mitad.
- El número esperado de claves en bins con al menos claves en ellos está delimitado por encima de . [7] Por lo tanto, si la capacidad de cada contenedor se limita a tres veces el tamaño promedio (), el número total de llaves en contenedores desbordados es como máximo . Esto solo se aplica a una familia hash cuya probabilidad de colisión está delimitada por encima de. Si se usa una definición más débil, delimitándola por, este resultado ya no es cierto. [7]
Como las garantías anteriores son válidas para cualquier conjunto fijo , se mantienen si el conjunto de datos es elegido por un adversario. Sin embargo, el adversario tiene que hacer esta elección antes (o independientemente de) la elección aleatoria del algoritmo de una función hash. Si el adversario puede observar la elección aleatoria del algoritmo, la aleatoriedad no sirve para nada y la situación es la misma que el hash determinista.
La segunda y tercera garantía se utilizan normalmente junto con el refrito . Por ejemplo, se puede preparar un algoritmo aleatorio para manejar algunosnúmero de colisiones. Si observa demasiadas colisiones, elige otro aleatorio.de la familia y repite. La universalidad garantiza que el número de repeticiones sea una variable aleatoria geométrica .
Construcciones
Dado que cualquier dato informático puede representarse como una o más palabras de máquina, generalmente se necesitan funciones hash para tres tipos de dominios: palabras de máquina ("números enteros"); vectores de longitud fija de palabras de máquina; y vectores de longitud variable ("cadenas").
Hashing enteros
Esta sección se refiere al caso de hash de números enteros que caben en palabras de máquinas; por lo tanto, operaciones como multiplicación, suma, división, etc. son instrucciones baratas a nivel de máquina. Deje que el universo a ser hash sea.
La propuesta original de Carter y Wegman [1] era elegir una y definir
dónde son números enteros elegidos aleatoriamente módulo con . (Esta es una sola iteración de un generador congruencial lineal ).
Para ver eso es una familia universal, tenga en cuenta que solo se sostiene cuando
por algún entero Entre y . Desde, Si su diferencia es distinto de cero y tiene un módulo inverso . Resolviendo para rendimientos
- .
Existen posibles opciones para (desde está excluido) y, variando en el rango permitido, posibles valores distintos de cero para el lado derecho. Por tanto, la probabilidad de colisión es
- .
Otra forma de ver Se trata de una familia universal mediante la noción de distancia estadística . Escribe la diferencia como
- .
Desde es distinto de cero y se distribuye uniformemente en , resulta que modulo también se distribuye uniformemente en . La distribución de es por tanto casi uniforme, hasta una diferencia en la probabilidad de entre las muestras. Como resultado, la distancia estadística a una familia uniforme es, que se vuelve insignificante cuando .
La familia de funciones hash más simples
es solo aproximadamente universal: para todos . [1] Además, este análisis es casi estricto; Carter y Wegman [1] muestran que cuando sea .
Evitar la aritmética modular
El estado de la técnica para el hash de números enteros es el esquema de desplazamiento múltiple descrito por Dietzfelbinger et al. en 1997. [8] Al evitar la aritmética modular, este método es mucho más fácil de implementar y también se ejecuta significativamente más rápido en la práctica (generalmente por al menos un factor de cuatro [9] ). El esquema asume que el número de bins es una potencia de dos,. Dejarsea el número de bits en una palabra de máquina. Luego, las funciones hash se parametrizan sobre enteros positivos impares (que encaja en una palabra de bits). Para evaluar, multiplicar por modulo y luego mantener el orden alto bits como el código hash. En notación matemática, esto es
y se puede implementar en lenguajes de programación similares a C mediante
(size_t) (a*x) >> (w-M)
Este esquema no satisface la propiedad de diferencia uniforme y solo es-casi-universal ; para cualquier, .
Para comprender el comportamiento de la función hash, observe que, si y tienen los mismos bits 'M' de mayor orden, entonces tiene todos los 1 o todos los 0 como sus bits M de orden más alto (dependiendo de si o es más grande). Suponga que el bit conjunto menos significativo de aparece en la posición . Desdees un número entero impar aleatorio y los números enteros impares tienen inversos en el anillo , resulta que se distribuirá uniformemente entre -bits enteros con el bit establecido menos significativo en la posición . La probabilidad de que estos bits sean todos 0 o 1 es, por lo tanto, como máximo. Por otro lado, si, luego M bits de orden superior de contienen ceros y unos, por lo que es seguro que . Finalmente, si luego mordido de es 1 y si y solo si bits son también 1, lo que ocurre con probabilidad .
Este análisis es estrecho, como se puede demostrar con el ejemplo y . Para obtener una función hash verdaderamente 'universal', se puede usar el esquema de multiplicar-agregar-turno
que se puede implementar en lenguajes de programación similares a C mediante
(size_t) (a*x+b) >> (w-M)
dónde es un entero positivo impar aleatorio con y es un número entero aleatorio no negativo con . Con estas opciones de y , para todos . [10] Esto difiere levemente pero de manera importante del error de traducción en el documento en inglés. [11]
Vectores de hash
Esta sección se ocupa del hash de un vector de longitud fija de palabras de máquina. Interprete la entrada como un vector de palabras de máquina (números enteros de bits cada uno). Sies una familia universal con la propiedad de diferencia uniforme, la siguiente familia (que se remonta a Carter y Wegman [1] ) también tiene la propiedad de diferencia uniforme (y por lo tanto es universal):
- , donde cada se elige de forma independiente al azar.
Si es una potencia de dos, se puede reemplazar la suma por exclusiva o. [12]
En la práctica, si se dispone de aritmética de doble precisión, se crea una instancia con la familia de funciones hash de desplazamiento múltiple. [13] Inicialice la función hash con un vectorde enteros impares aleatorios enbits cada uno. Entonces, si el número de contenedores es por :
- .
Es posible reducir a la mitad el número de multiplicaciones, lo que se traduce aproximadamente en una aceleración del doble en la práctica. [12] Inicialice la función hash con un vectorde enteros impares aleatorios enbits cada uno. La siguiente familia de hash es universal: [14]
- .
Si las operaciones de doble precisión no están disponibles, se puede interpretar la entrada como un vector de medias palabras (-bits enteros). El algoritmo utilizará multiplicaciones, donde era el número de medias palabras en el vector. Por lo tanto, el algoritmo se ejecuta a una "tasa" de una multiplicación por palabra de entrada.
El mismo esquema también se puede utilizar para hash de números enteros, interpretando sus bits como vectores de bytes. En esta variante, la técnica vectorial se conoce como hash de tabulación y proporciona una alternativa práctica a los esquemas de hash universal basados en la multiplicación. [15]
También es posible una fuerte universalidad a alta velocidad. [16] Inicialice la función hash con un vector de enteros aleatorios en bits. Calcular
- .
El resultado es fuertemente universal en bits. Experimentalmente, se encontró que se ejecutaba a 0.2 ciclos de CPU por byte en procesadores Intel recientes para.
Hashing de cadenas
Esto se refiere al hash de un vector de palabras de máquina de tamaño variable . Si la longitud de la cadena puede estar limitada por un número pequeño, es mejor usar la solución vectorial de arriba (rellenando conceptualmente el vector con ceros hasta el límite superior). El espacio requerido es la longitud máxima de la cuerda, pero el tiempo para evaluar es solo la longitud de . Siempre que los ceros estén prohibidos en la cadena, el relleno de ceros se puede ignorar al evaluar la función hash sin afectar la universalidad. [12] Tenga en cuenta que si se permiten ceros en la cadena, entonces sería mejor agregar un carácter ficticio distinto de cero (por ejemplo, 1) a todas las cadenas antes del relleno: esto asegurará que la universalidad no se vea afectada. [dieciséis]
Ahora suponga que queremos hash , donde un buen salto en no se conoce a priori. Una familia universal propuesta por [13] trata la cadenacomo los coeficientes de un polinomio módulo un primo grande. Si, dejar ser un primo y definir:
- , dónde es uniformemente aleatorio y se elige al azar de un dominio entero de mapeo familiar universal .
Utilizando las propiedades de la aritmética modular, lo anterior se puede calcular sin producir grandes números para cadenas grandes de la siguiente manera: [17]
uint hash ( String x , int a , int p ) uint h = INITIAL_VALUE for ( uint i = 0 ; i < x . length ; ++ i ) h = (( h * a ) + x [ i ]) mod p return h
Este hash rodante de Rabin-Karp se basa en un generador de congruencia lineal . [18] El algoritmo anterior también se conoce como función hash multiplicativa . [19] En la práctica, el operador mod y el parámetro p pueden evitarse por completo simplemente permitiendo que el entero se desborde porque es equivalente a mod ( Max-Int-Value + 1) en muchos lenguajes de programación. La siguiente tabla muestra los valores elegidos para inicializar hya para algunas de las implementaciones populares.
Implementación | VALOR INICIAL | a |
---|---|---|
Función hash de Bernstein djb2 [20] | 5381 | 33 |
STLPort 4.6.2 | 0 | 5 |
Función hash de Kernighan y Ritchie [21] | 0 | 31 |
java.lang.String.hashCode() [22] | 0 | 31 |
Considere dos cadenas y deja sea la longitud del más largo; para el análisis, la cadena más corta se rellena conceptualmente con ceros hasta la longitud. Una colisión antes de aplicar implica que es una raíz del polinomio con coeficientes . Este polinomio tiene como máximo modulo de raíces , por lo que la probabilidad de colisión es como máximo . La probabilidad de colisión a través del azar. lleva la probabilidad total de colisión a . Por lo tanto, si la primaes lo suficientemente grande en comparación con la longitud de las cadenas hash, la familia es muy cercana a universal (en distancia estadística ).
Otras familias universales de funciones hash que se utilizan para convertir cadenas de longitud desconocida en valores hash de longitud fija incluyen la huella digital de Rabin y Buzhash .
Evitar la aritmética modular
Para mitigar la penalización computacional de la aritmética modular, se utilizan tres trucos en la práctica: [12]
- Uno elige el mejor estar cerca de una potencia de dos, como una prima de Mersenne . Esto permite módulo aritméticopara ser implementado sin división (usando operaciones más rápidas como suma y turnos). Por ejemplo, en arquitecturas modernas se puede trabajar, tiempo son valores de 32 bits.
- Se puede aplicar hash vectorial a los bloques. Por ejemplo, uno aplica hash vectorial a cada bloque de 16 palabras de la cadena y aplica hash de cadena a laresultados. Dado que el hash de cadena más lento se aplica en un vector sustancialmente más pequeño, esto será esencialmente tan rápido como el hash de vector.
- Uno elige una potencia de dos como divisor, lo que permite el módulo aritmético para ser implementado sin división (usando operaciones más rápidas de enmascaramiento de bits ). La familia de funciones hash NH adopta este enfoque.
Ver también
- Hash independiente de K
- Hash rodante
- Hash de tabulación
- Independencia mínima
- Función hash unidireccional universal
- Secuencia de baja discrepancia
- Hash perfecto
Referencias
- ^ a b c d e Carter, Larry; Wegman, Mark N. (1979). "Clases universales de funciones hash". Revista de Ciencias de la Computación y Sistemas . 18 (2): 143-154. doi : 10.1016 / 0022-0000 (79) 90044-8 . Versión conferencia en STOC'77.
- ^ Miltersen, Peter Bro. "Hashing universal" (PDF) . Archivado desde el original (PDF) el 24 de mayo de 2011 . Consultado el 24 de junio de 2009 .
- ^ Motwani, Rajeev; Raghavan, Prabhakar (1995). Algoritmos aleatorios . Prensa de la Universidad de Cambridge. pag. 221. ISBN 0-521-47465-5.
- ^ David Wagner, ed. "Avances en Criptología - CRYPTO 2008" . pag. 145.
- ^ Jean-Philippe Aumasson, Willi Meier, Raphael Phan, Luca Henzen. "La función hash BLAKE" . 2014. p. 10.
- ^ Thorup, Mikkel (2015). "Hashing de alta velocidad para enteros y cadenas". arXiv : 1504.06804 [ cs.DS ].
- ^ a b Baran, Ilya; Demaine, Erik D .; Pătraşcu, Mihai (2008). "Algoritmos subcuadráticos para 3SUM" (PDF) . Algoritmica . 50 (4): 584–596. doi : 10.1007 / s00453-007-9036-3 .
- ^ Dietzfelbinger, Martin; Hagerup, Torben; Katajainen, Jyrki; Penttonen, Martti (1997). "Un algoritmo aleatorio confiable para el problema del par más cercano" (Posdata) . Revista de algoritmos . 25 (1): 19–51. doi : 10.1006 / jagm.1997.0873 . Consultado el 10 de febrero de 2011 .
- ^ Thorup, Mikkel . "Algoritmos de libros de texto en SODA" .
- ^ Woelfel, Philipp (2003). Über die Komplexität der Multiplikation in eingeschränkten Branchingprogrammmodellen (PDF) (Ph.D.). Universität Dortmund . Consultado el 18 de septiembre de 2012 .
- ^ Woelfel, Philipp (1999). Hashing eficiente, fuertemente universal y óptimamente universal . Fundamentos matemáticos de la informática 1999. LNCS. 1672 . págs. 262-272. doi : 10.1007 / 3-540-48340-3_24 .
- ^ a b c d Thorup, Mikkel (2009). Hash de cadena para palpado lineal . Proc. 20º Simposio ACM-SIAM sobre Algoritmos Discretos (SODA) . págs. 655–664. CiteSeerX 10.1.1.215.4253 . doi : 10.1137 / 1.9781611973068.72 ., sección 5.3
- ^ a b Dietzfelbinger, Martin; Gil, Joseph; Matias, Yossi; Pippenger, Nicholas (1992). Las funciones hash polinomiales son confiables (resumen extendido) . Proc. XIX Coloquio Internacional sobre Autómatas, Lenguajes y Programación (ICALP) . págs. 235–246.
- ^ Black, J .; Halevi, S .; Krawczyk, H .; Krovetz, T. (1999). UMAC: Autenticación de mensajes rápida y segura (PDF) . Avances en Criptología (CRYPTO '99) ., Ecuación 1
- ^ Pătraşcu, Mihai ; Thorup, Mikkel (2011). El poder del hash de tabulación simple . Actas del 43º Simposio anual de ACM sobre teoría de la computación (STOC '11) . págs. 1-10. arXiv : 1011.5200 . doi : 10.1145 / 1993636.1993638 .
- ^ a b Kaser, Owen; Lemire, Daniel (2013). "El hash de cadena fuertemente universal es rápido". Revista informática . Prensa de la Universidad de Oxford. 57 (11): 1624–1638. arXiv : 1202.4961 . doi : 10.1093 / comjnl / bxt070 .
- ^ "Diapositivas del curso de la Universidad Hebrea" (PDF) .
- ^ Robert Uzgalis. "Funciones de biblioteca hash" . 1996.
- ^ Kankowsk, Peter. "Funciones hash: una comparación empírica" .
- ^ Yigit, Ozan. "Funciones hash de cadenas" .
- ^ Kernighan; Ritchie (1988). "6". El lenguaje de programación C (2ª ed.). págs. 118 . ISBN 0-13-110362-8.CS1 maint: varios nombres: lista de autores ( enlace )
- ^ "Cadena (Java Platform SE 6)" . docs.oracle.com . Consultado el 10 de junio de 2015 .
Otras lecturas
- Knuth, Donald Ervin (1998). El arte de la programación informática, vol. III: Clasificación y búsqueda (3ª ed.). Lectura, misa; Londres: Addison-Wesley. ISBN 0-201-89685-0.
enlaces externos
- Estructuras de datos abiertos - Sección 5.1.1 - Hashing multiplicativo , Pat Morin