Te recomendamos que revises esta resolución en un ambiente controlado antes de pasarlo a producción, un saludo.
Solución:
El artículo de Wikipedia tendrá mucha información técnica, pero una visión simplista del hash es algo como lo siguiente.
Imagina que existe una función mágica que puede dar un número a cualquier objeto. Dado el mismo objeto, siempre devuelve el mismo número.
Inmediatamente ahora tienes una forma rápida de probar si dos objetos son iguales: pregunta a esta función por sus números y compara. Si son diferentes, entonces no son iguales.
Pero, ¿y si tienen el mismo número? ¿Pueden dos objetos diferentes tener el mismo número?
Sí, esto es posible en la mayoría de los escenarios. Digamos que la función solo puede dar números entre 1..10, por ejemplo, y hay 100 objetos diferentes. Entonces, por supuesto, algunos objetos diferentes deben tener el mismo número. Esto es lo que se llama una “colisión”. Una “colisión” hace que nuestra prueba rápida de igualdad no sea tan útil, por lo que queremos minimizar que suceda en la medida de lo posible. Una buena función mágica es aquella que intentaría minimizar el número de “colisiones”.
Entonces, ¿qué más puedes hacer con este número? Bueno, puedes usarlo para indexar un array. Dado un objeto, puedes ponerlo en el índice dado por el número de esta función mágica. Esta array es esencialmente lo que es una tabla hash; esta función mágica es una función hash.
Una función hash es una forma de crear una representación compacta de una cantidad arbitrariamente grande de datos. En Java, con el método hashcode, esto significa describir de alguna manera el estado de su objeto (no importa cuán grande sea) en un int (4 bytes). Y generalmente se escribe para ser bastante rápido como se explica a continuación.
Para simplificar en hashtables/hashmaps, el código hash sirve como una especie de equivalente barato. Tome dos objetos a y b de tipo Foo, digamos para averiguar si a.equals (b) toma 500 ms, mientras que calcular un código hash (eficiente) solo toma 10 ms. Entonces, si queremos saber si a. es igual a (b) en lugar de hacerlo directamente, primero miraremos los códigos hash y preguntaremos si a.hashCode() == b.hashCode(). Tenga en cuenta que esto tomará solo 20 ms en nuestro ejemplo.
Debido a la definición API de hashcode, sabemos que si el código hash de a no es igual a b, entonces a.equals(b) nunca debe ser true. Entonces, en nuestra prueba anterior, si vemos que los códigos hash son desiguales, nunca necesitamos hacer la prueba .equals() más larga, esta es la razón siempre debe anular hashCode y equals juntos.
También puede ver referencias sobre cómo escribir códigos hash “buenos” o “bien distribuidos”. Esto tiene que ver con el hecho de que la inversa de las declaraciones anteriores sobre hashcode y equals no es true. Más específicamente a.hashCode() == b.hashCode() no implica necesariamente a.equals(b) Entonces, la idea de un buen código hash es reducir la probabilidad de a.hashCode() == b.hashCode() cuando a.equals(b) es false. Es posible que haya visto que esto se conoce como una colisión de una función hash.
Volver a hashmaps/tablas. Estos se basan en key/valor pares. Entonces, cuando agregue o recupere un valor, proporcionará un key. Así que lo primero que tiene que hacer el mapa es buscar el keylo que significa encontrar algo que .igual() el key tu provees. Pero como discutimos anteriormente, .equals() puede ser increíblemente lento, lo que significa que las comparaciones pueden acelerarse enormemente al verificar primero los códigos hash. Dado que cuando los códigos hash están bien distribuidos, debe saber rápidamente cuándo x es definitivamente != y.
Ahora, además de la comparación, los mapas hash/tablas en realidad usan los códigos hash para organizar su almacenamiento interno de los datos, sin embargo, creo que eso está más allá del alcance de lo que está buscando entender en este momento.
FUNCIÓN HASH:- Una función hash toma un grupo de caracteres (llamado key) y lo asigna a un valor de cierta longitud (llamado valor hash o hash). El valor hash es representativo del original. string de caracteres, pero normalmente es más pequeño que el original. El hashing se realiza para indexar y ubicar elementos en bases de datos porque es más fácil encontrar el valor hash más corto que el más largo. string. Hashing también se usa en el cifrado. Este término también se conoce como algoritmo hash o función de resumen de mensajes.
HASH MAP: – HashMap es una clase de colección que está diseñada para almacenar elementos como key-pares de valores. Los mapas proporcionan una forma de buscar una cosa en función del valor de otra.
Una tabla de búsqueda que está diseñada para almacenar eficientemente datos no contiguos keys (números de cuenta, números de parte, etc.) que pueden tener grandes espacios en sus secuencias alfabéticas o numéricas.
HASH TABLE: las tablas hash se crean con un algoritmo que almacena la keys en cubos de hachís, que contienen key-pares de valores. Desde diferentes keys puede hacer hash en el mismo cubo, el objetivo del diseño de la tabla hash es distribuir el key-los valores se emparejan uniformemente con cada cubo que contiene tan pocos key-valor pares como sea posible. Cuando se busca un elemento, su key se aplica hash para encontrar el cubo apropiado y luego se compara el cubo para encontrar el correcto key-par de valores.
Si tienes alguna desconfianza o capacidad de ascender nuestro enunciado puedes realizar una crítica y con deseo lo analizaremos.