¿Qué es hashing en términos simples?

  • 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….

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?

¿Es correcto mi nuevo estado de ánimo? Ingresé a la programación desde un punto de vista de programación algorítmica y, como tal, tengo una inclinación a querer saber cómo funcionan las cosas debajo. Pero ahora, después de un tiempo en el mundo de los desarrolladores, finalmente tengo que darme cuenta de que se trata menos de eso. ¿Lo que usted dice?

Cómo guardar una entrada del usuario en una matriz definida en Java

Dado un laberinto cuadrado, cada entrada en el laberinto es una celda abierta 'O' o una pared 'X'. Una rata puede viajar a sus ubicaciones adyacentes (izquierda, derecha, arriba y abajo), pero para llegar a una celda, debe estar abierta. Dadas las ubicaciones de las ratas, ¿puedes averiguar si todas las ratas pueden alcanzar a las demás?

¿Cuáles son los mejores cursos en línea para estructuras de datos y algoritmos (deben enfatizar más en escribir código)?

¿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

¿Los desarrolladores de Google realmente usan conceptos como la notación O grande para determinar el tiempo de ejecución de un algoritmo en un proceso de codificación diario?

Si hipotéticamente encontré un algoritmo que genera rendimientos comerciales al 100% anualmente, ¿qué debo hacer con él?

¿Cuáles son las aplicaciones de la vida real del algoritmo de Prim?

En un microprocesador 8085, ¿cómo podemos encontrar el número de ciclos de la máquina y el número de estados T de cualquier mnemónico dado?

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