Java 8 proporciona un hash alternativo para las claves String para mejorar el rendimiento cuando se encuentra una gran cantidad de colisiones clave de código hash. ¿Alguien puede explicar qué es eso y cómo funcionará?¿Qué es el hash alternativo para las claves de cadena en Java 8?
Respuesta
De this email de [email protected]
:
- Se introduce una nueva interfaz de Hashable32.
- Hashable32 proporciona un hash32 método()
- cadena implementa método Hashable32 y hash32()
- HashMap et al reconocer cadena e invocar hash32() en lugar de hashCode()
Las revisiones de el código:
- Murmur3: https://code.google.com/p/smhasher/wiki/MurmurHash3
- althashing "7" webrev : http://cr.openjdk.java.net/~mduigou/althashing7/8/webrev/
- althashing "8" webrev: http://cr.openjdk.java.net/~mduigou/althashing8/8/webrev/
Por lo que puedo decir, los mayores defectos con el viejo algoritmo hash fueron que algunas veces volvía a cero para cadenas largas, y que especificar una implementación particular impedía la posibilidad de que la VM implementara una función "cadena de caracteres" diseñada para rendimiento óptimo en esa máquina en particular (por ejemplo, una máquina de 64 bits puede usar una función que opera en grupos de 8 bytes y luego reduce el resultado a 32 bits). Me pregunto cuánto código realmente confía en los valores exactos del antiguo hash de cadena, y qué tan difícil sería permitir una 'solución alternativa de compatibilidad'. – supercat
Cabe señalar que el cambio hacia MurmurHash3 no impedirá ataques DoS: http://emboss.github.com/blog/2012/12/14/breaking-murmur-hash-flooding-dos-reloaded/
Para traer más relevancia a esta cuestión, el hashing alternativo ha sido eliminado de JDK 8. Check out:
http://docs.oracle.com/javase/8/docs/technotes/guides/collections/changes8.html
http://openjdk.java.net/jeps/180
Es interesante notar que una vez que el número de elementos en un cubo dispersa crece más allá de un cierto umbral, que el cubo podrá pasar de utilizar una lista enlazada de entradas a un árbol de equilibrado.
La función hash (Object key) en el HashMap se ha revisado al siguiente sin ningún tratamiento especial para los objetos String:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode())^(h >>> 16);
}
- 1. ¿Cómo buscar en redis las claves hash?
- 2. ¿Cómo encontrar las claves de un hash?
- 3. Cadena Java codificada en UTF-8 en las Propiedades
- 4. Rubí JSON de análisis cambia las claves hash
- 5. reconociendo "tipo" de claves hash
- 6. rubí nueva notación hash de colon con claves de cadena
- 7. Mapas anidados o claves combinadas en java
- 8. ¿Qué es hash exactamente?
- 9. Uso de enteros como claves hash
- 10. ¿Qué es una buena función hash de 64 bits en Java para cadenas textuales?
- 11. ¿Cómo uso las claves hash como métodos en una clase?
- 12. Eliminar claves en el hash no en el conjunto
- 13. Función hash para una cadena
- 14. Qué hash usar para la exclusividad de archivos en Java
- 15. Java NIO select() regresa sin las claves seleccionadas, ¿por qué?
- 16. Replicación de MySQL para el escenario alternativo
- 17. Probando si un hash tiene alguna de las claves
- 18. Eliminar matriz de claves en Ruby Hash
- 19. ¿Perl garantiza devolución de claves hash ordenadas?
- 20. tabla hash optimizado para la plena iteración + sustitución de claves
- 21. ¿Qué prueba de igualdad utiliza Ruby's Hash al comparar claves?
- 22. GetHashCode() con claves de cadena
- 23. ¿Cómo puedo filtrar una matriz de valores hash para obtener solo las claves en otra matriz?
- 24. Analizador XML alternativo para ElementTree para aliviar problemas de UTF-8?
- 25. Cómo cambiar todas las claves de un hash por un nuevo conjunto de claves dadas
- 26. Java: ¿Qué es "para (;;)"
- 27. ¿LinkedHashMap de Java mantiene el orden de las claves?
- 28. ¿Qué es una buena función hash para palabras en inglés?
- 29. Creación de un hash de varios cadena de objetos Java
- 30. ¿Qué es una estructura de datos similar a una tabla hash, pero las claves utilizadas con poca frecuencia se eliminan?
+1 Esto podría ser utilizado para evitar ataques de denegación de servicio. –
Gracias, tendré esto en cuenta –
@PeterLawrey ¿Te refieres a [este informe de error] (https://bugzilla.redhat.com/show_bug.cgi?id=750533) o algo más cuando mencionas DoS? –