Estoy tratando de pensar en una buena función hash para cadenas. Y estaba pensando que podría ser una buena idea resumir los valores Unicode para los primeros cinco caracteres de la cadena (suponiendo que tenga cinco, de lo contrario, pare donde termina). ¿Sería una buena idea, o es mala?
Estoy haciendo esto en Java, pero no me imagino que eso haga una gran diferencia.
String
la propiahashCode()
?Respuestas:
Por lo general, los hashes no haría sumas, de lo contrario
stop
, ypots
tendrá el mismo hash.y no lo limitarías a los primeros n caracteres porque de lo contrario la casa y las casas tendrían el mismo hash.
En general, los valores hash toman valores y los multiplican por un número primo (lo que hace que sea más probable que genere valores hash únicos). Por lo tanto, puede hacer algo como:
fuente
Si se trata de una cuestión de seguridad, podría usar Java crypto:
fuente
Probablemente deberías usar String.hashCode () .
Si realmente quieres implementar hashCode tú mismo:
Usar solo los primeros cinco caracteres es una mala idea . Piense en nombres jerárquicos, como URL: todos tendrán el mismo código hash (porque todos comienzan con "http: //", lo que significa que están almacenados bajo el mismo depósito en un mapa hash, exhibiendo un rendimiento terrible.
Aquí hay una historia de guerra parafraseada en String hashCode de " Java efectivo ":
fuente
Si estás haciendo esto en Java, ¿por qué lo estás haciendo? Solo llama
.hashCode()
a la cuerdafuente
.hashCode()
. Más bien, use algún algoritmo conocido.String::hashCode
se especifica en el JDK, por lo que es tan portátil como la existencia misma de la clasejava.lang.String
.Guava's
HashFunction
( javadoc ) proporciona un hash decente sin cripto-fuerte.fuente
404
d.Esta función provista por Nick es buena, pero si usa una nueva Cadena (byte [] bytes) para realizar la transformación a Cadena, falló. Puede usar esta función para hacer eso.
Puede ser que esto pueda ayudar a alguien
fuente
Fuente Lógica detrás de la función hash djb2 - SO
fuente
Se rumorea que FNV-1 es una buena función hash para cadenas.
Para cadenas largas (más largas que, digamos, unos 200 caracteres), puede obtener un buen rendimiento de la función hash MD4 . Como función criptográfica, se rompió hace unos 15 años, pero para fines no criptográficos, sigue siendo muy bueno y sorprendentemente rápido. En el contexto de Java, tendría que convertir los
char
valores de 16 bits en palabras de 32 bits, por ejemplo, agrupando dichos valores en pares. Una implementación rápida de MD4 en Java se puede encontrar en sphlib . Probablemente exagere en el contexto de una tarea en el aula, pero vale la pena intentarlo.fuente
Si desea ver las implementaciones estándar de la industria, miraría java.security.MessageDigest .
"Los resúmenes de mensajes son funciones hash unidireccionales seguras que toman datos de tamaño arbitrario y generan un valor hash de longitud fija".
fuente
Aquí hay un enlace que explica muchas funciones hash diferentes, por ahora prefiero la función hash ELF para su problema particular. Toma como entrada una cadena de longitud arbitraria.
fuente
sdbm: este algoritmo se creó para la biblioteca de base de datos sdbm (una reimplementación de dominio público de ndbm)
fuente
fuente
Es una buena idea trabajar con números impares cuando se trata de desarrollar una buena función hast para string. Esta función toma una cadena y devuelve un valor de índice, hasta ahora funciona bastante bien. y tiene menos colisión. el índice varía de 0 a 300, tal vez incluso más que eso, pero hasta ahora no he subido incluso con palabras largas como "ingeniería electromecánica"
Otra cosa que puede hacer es multiplicar cada carácter por el índice a medida que aumenta, como la palabra "oso" (0 * b) + (1 * e) + (2 * a) + (3 * r) que le dará Un valor int para jugar. la primera función hash anterior colisiona en "aquí" y "escucha" pero sigue siendo excelente para dar buenos valores únicos. el siguiente no choca con "aquí" y "escuchar" porque multiplico cada carácter con el índice a medida que aumenta.
fuente
Aquí hay una función hash simple que uso para una tabla hash que construí. Básicamente es para tomar un archivo de texto y almacena cada palabra en un índice que representa el orden alfabético.
Lo que esto básicamente hace es que las palabras se dividen según su primera letra. Entonces, la palabra que comienza con 'a' obtendría una clave hash de 0, 'b' obtendría 1 y así sucesivamente y 'z' sería 25. Los números y símbolos tendrían una clave hash de 26. Hay una ventaja que proporciona ; Puede calcular fácil y rápidamente dónde se indexaría una palabra dada en la tabla hash, ya que todo está en un orden alfabético, algo así: el código se puede encontrar aquí: https://github.com/abhijitcpatil/general
Este sería el resultado:
fuente
Esto evitará cualquier colisión y será rápido hasta que usemos el desplazamiento en los cálculos.
fuente