2012-08-14 24 views
10

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?

+1

+1 Esto podría ser utilizado para evitar ataques de denegación de servicio. –

+0

Gracias, tendré esto en cuenta –

+0

@PeterLawrey ¿Te refieres a [este informe de error] (https://bugzilla.redhat.com/show_bug.cgi?id=750533) o algo más cuando mencionas DoS? –

Respuesta

7

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:

+0

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

6

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); 
} 
Cuestiones relacionadas