- Por lo general, una función hash es un mapa de objetos (como cadenas) a enteros en un rango fijo. Por ejemplo, en Java, el método hashCode hace un hash de cualquier objeto a un entero de 32 bits.
- El mismo objeto siempre tendrá el mismo número entero. Sin embargo, dos objetos pueden dividirse en el mismo número entero. Decimos que chocan.
- No todas las funciones hash tienen colisiones. Puede evitar colisiones construyendo una función hash perfecta (consulte http://en.wikipedia.org/wiki/Per…). Sin embargo, esto requiere conocer con anticipación el conjunto de objetos que necesita analizar. Además, construir y calcular una función hash perfecta podría ser costoso.
- Las funciones hash tienen muchas aplicaciones más allá de la “recuperación”. Por ejemplo, imagine que está buscando líneas de texto que ocurren frecuentemente en un conjunto de documentos. El hash puede permitirle determinar muy rápida y económicamente cuáles son estas líneas, siempre que pueda tolerar algún error. Vea, por ejemplo, este documento: http://arxiv.org/abs/0707.1913. Este tipo de trabajo conduce a algoritmos de compresión rápida donde primero identifica cadenas frecuentes y luego las comprime (IBM DB2 usa esta forma de compresión). En términos más generales, es posible que desee leer sobre los filtros Bloom (http://en.wikipedia.org/wiki/Blo…). En criptografía, el hash se usa para asegurarse de que un documento no se haya modificado. Ver por ejemplo CRC32.
- Si está interesado en la teoría del hash de cadenas, escribí un par de artículos sobre el tema: http://arxiv.org/abs/0705.4676 y http://arxiv.org/abs/1008.1715. También publiqué algunos programas: http://code.google.com/p/ngramha… y http://code.google.com/p/variabl….
¿Qué es hashing en términos simples?
Related Content
¿Cuál es el peor caso, el caso promedio y la mejor complejidad de tiempo de un algoritmo?
¿Necesita algoritmos para la interfaz de usuario?
¿Te gusta la categoría de algoritmos de 'programación dinámica'?
Hash básico: un mod k
dónde
a es un número entero que representa la cosa que quieres hacer hash
k es un número (tal vez es primo como 3 o 7)
Ejemplo
hacer picadillo “hola mundo”
la representación ASCII de Hello World es
a = 72 101 108 108 111 32 119 111 114 108 100
usemos ingenuamente este número. luego
un mod 3 = 1
¿Por qué es esto malo?
porque muchos objetos serán hash a 1
100 mod 3 = 1
400 mod 3 = 1
y así
Obviamente esta función no se puede invertir.
No hay nada mágico en un hash básico; Los usamos todo el tiempo en la vida cotidiana. Pero en la vida cotidiana no encontramos números de 30 dígitos, excepto que la computadora genera cosas como códigos de barras de productos, números VIN de automóviles, etc.
Para lidiar con los números realmente grandes que aparecen en las computadoras, la mayoría de las funciones hash son combinaciones complejas de (un mod k).
Nota: también puede ver hashes representados usando funciones XOR o una máscara de bits
–
en colisiones: un llamado “hash perfecto” es solo una lista numerada. Esto generalmente no es cómo evitar colisiones. Los hashes buenos (no criptográficos), como MurmurHash y CityHash, se han ajustado experimentalmente:
http://code.google.com/p/cityhash/
tengo una implementación en ruby si la necesitas
cityhash
–
si los hashes son rápidos: los hash simples no son tan rápidos porque acceder a la memoria de la computadora no es uniforme ni instantáneo. Cada vez que realiza una búsqueda hash, en una implementación ingenua, esencialmente está accediendo a la memoria aleatoriamente, lo que provoca un posible error de página (lo que significa que los datos deben fluir desde sus cachés de bajo nivel hasta el bus / interconexión de memoria y en los registros del procesador) .
Permítanme intentar explicarlo en los términos más simples posibles.
En primer lugar, un hash es un tipo de función. Si le das alguna entrada, devolverá algo de salida.
Un hash ideal es una función uno a uno. Para cada entrada, hay una salida única. Dos entradas diferentes no pueden dar como resultado la misma salida.
Un hash real es una función de muchos. Existe la posibilidad de que más de una entrada pueda dar como resultado la misma salida.
Qué tan buena se analiza una función hash al verificar la probabilidad de que más de una entrada tenga la misma salida. Cuanto menor es la probabilidad, mejor es la función hash.
Ahora un detalle importante, una función hash no es un método de cifrado en general. Lo que eso significa es que no puede derivar la entrada en función de la salida de la función hash.
Entonces, ¿por qué usar una función hash?
El ejemplo más simple es comparar dos archivos de película grandes para ver si son exactamente iguales.
Ahora es difícil pasar una película de 3 horas, cuadro por cuadro y verificar si son iguales. El método más simple aquí es generar un hash para ambos archivos.
Los hashes se generan en un segundo. Y luego, es solo cuestión de comparar dos cadenas.
Una aplicación más práctica de esto, similar al ejemplo anterior, es esta. Supongamos que voy a descargar, digamos, una versión pirateada de Windows 10 de un amigo mío.
Pero sé que es un estafador y podría haber manipulado el archivo ISO. Entonces tomo el hash dado en el sitio web de Microsoft y lo comparo con el archivo que está dando.
Bueno, podría ser mucho para asimilar, pero espero que esto ayude.
¡Aclamaciones!
More Interesting
¿Cuáles son algunas aplicaciones del mundo real de parábolas?
Cómo guardar una entrada del usuario en una matriz definida en Java
¿Cuál es el algoritmo más utilizado a nuestro alrededor?
Cómo calcular la velocidad de un algoritmo
Cómo resolver esta recurrencia T (n) = T (sqrt (n)) + log_2 n
¿Cuáles son las aplicaciones de la vida real del algoritmo de Prim?
¿Cuál es el menor número de operaciones necesarias para ordenar una matriz de n objetos arbitrarios?
¿Qué debe saber todo programador sobre Lisp?
¿Cuál es el "mejor" sitio para estudiar estructuras de datos durante las ubicaciones?