Cómo crear mi propia función de hash para usar en una tabla de búsqueda

Aquí hay dos ideas de alto nivel.

  1. Intenta encontrar una manera de asignar un objeto a un entero. Intente incorporar cada pequeña característica de ese objeto de modo que se obtenga un nuevo entero después de convertirlo. Que esto sea una función [matemáticas] f [/ matemáticas]
  2. Asigne este entero a un entero más pequeño que tendrá una longitud [matemática] 0 [/ matemática] a [matemática] m – 1 [/ matemática] donde [matemática] m [/ matemática] es la longitud de la matriz que está utilizando como una tabla hash. Que esto sea una función [matemáticas] g [/ matemáticas].

Deje que [math] x [/ math] sea el objeto de entrada. Debe encontrar [math] f (g (x)) [/ math], que es solo un número en el rango [math] 0 \ leq x <m [/ math].

Por ejemplo, considere el método hashCode en java. Toma un objeto y escupe un número entero de 32 bits. Para un número entero, simplemente podría devolver su valor para una implementación de hashCode . Para un objeto más complicado, como una cadena, puede combinar los valores ascii de todos los caracteres en la cadena para producir un número grande y luego devolver ese número mod [math] 2 ^ {32} [/ math].

Finalmente, después de tener la función [math] f [/ math], necesitamos una función [math] g [/ math] que se asigne al rango [math] [0, m-1] [/ math]. El más simple es [matemáticas] g (x) = x \ pmod {m} [/ matemáticas]. Las funciones más elegantes se utilizan en la práctica.

No veo el beneficio, ya que la generación de hash son algoritmos bien dominados y hay poco que ganar en términos de diferenciación mediante el uso de la propia función.

Pero si el beneficio es para aprender o evitar el uso del código de otra persona, entonces podría ser válido. No debería ser difícil encontrar en Internet varios códigos fuente para las funciones hash que se pueden inspeccionar o convertir a su idioma de destino.

Una buena función hash distribuirá los códigos generados de manera más o menos homogénea dentro de un rango. Por lo tanto, incluso si la entrada se concentra principalmente en letras y / u otro subrango de caracteres, la salida se distribuirá uniformemente en todo el rango de resultados. Es importante evitar demasiadas colisiones en los códigos de salida (es decir, una distribución desigual) porque el hash es una clave; Si hay demasiadas colisiones, la parte del algoritmo que almacena / recupera valores generalmente será menos eficiente.

Una forma de evitar colisiones es hacer algunas operaciones de intercambio / bit en su entrada; o multiplique los bytes de entrada por algunos números primos muy grandes.

Una pregunta interesante

Una función hash decente debe tener dos atributos.

  1. Debe ser simple y ejecutarse rápidamente
  2. Debe minimizar las “colisiones”, es decir, dos miembros de la tabla que tienen el mismo código hash.

Una de las funciones de hash más fáciles de implementar es generar una suma de comprobación para cada miembro de la tabla y usarla como código hash.

More Interesting

¿Cuál es el mejor algoritmo para verificar si un número es primo?

¿Qué estructura de datos usa internamente un objeto en los lenguajes OOP? ¿Qué algoritmo se usa para la búsqueda de propiedades en un objeto?

¿Cómo podemos lograr la inserción en el hash en el peor de los casos en O (1) mediante el uso de la matriz, mientras que las matrices tienen problemas de extensión en filledup?

¿Por qué el tipo de este código JavaScript siempre es una 'Cadena' a pesar de que estoy ingresando un número en el campo de entrada?

¿Cuál es la relación de recurrencia para el tipo de selección?

Cómo hacer que el código de una ordenación de inserción sea más optimizado utilizando una lista vinculada

¿Existe un algoritmo de clasificación que pueda ordenar los n números dados en O (1) donde n> 2?

¿Se introdujo la recursión a propósito?

¿Cuál es la elección ideal de algoritmos, bibliotecas en PNL y aprendizaje automático para construir un bot de chat?

Cómo aprender estructuras de datos de manera efectiva

¿Cuán ampliamente se utilizan los algoritmos de bandidos en los sistemas de recomendaciones modernos reales? ¿Y de qué manera?

¿Es así como se elimina de un árbol de búsqueda binario cuando un padre tiene dos subárboles?

¿Cuál es la diferencia entre una matriz y una variable?

Dado un problema, como un problema de diseño o un problema de algoritmos, ¿cómo resolverá un ingeniero de software experimentado ese problema?

¿Cuál es el propósito del binario?