Pregunta

Parece que hay un debate en curso acerca de si es seguro confiar en la implementación actual del String.hashCode() porque, técnicamente hablando, se garantiza por la especificación (Javadoc).

  1. ¿Por qué aplicación especificó Sun de String.hashCode() en la especificación?
  2. ¿Por qué los desarrolladores cada vez que tenga que depender de una implementación específica de hashCode ()?
  3. ¿Por qué es tan Sun miedo de que el cielo caerá si String.hashCode() se cambia en el futuro? (Probablemente esto se puede explicar por # 2)
¿Fue útil?

Solución

Una de las razones para confiar en la implementación específica de hashCode () sería si alguna vez se persistió a cabo en una base de datos, archivo o cualquier otro medio de almacenamiento. Las malas cosas (tm) que sucedería si los datos se vuelven a leer cuando el algoritmo de hash había cambiado. Se podía encontrar colisiones hash inesperados, y más preocupante es la incapacidad de encontrar algo por su hash porque el hash había cambiado entre los datos que persistieron y "ahora".

De hecho, eso explica más o menos el punto # 3 demasiado =)

La razón para el punto # 1 podría ser "para permitir la interoperabilidad". Si la aplicación hashCode se bloquea entonces los datos pueden ser compartidos entre diferentes implementaciones de Java con bastante seguridad. es decir, el hash de un objeto dado siempre será la misma independientemente de la aplicación.

Otros consejos

La aplicación tiene cambiado desde la clase String originales. Si no recuerdo mal, lo que solía ser que sólo cada 16 (?) Personaje fue utilizado en el hash para cadenas "largos".

Puede haber sido especificado para promover la interoperabilidad serialización entre las versiones posteriores de Java, o incluso entre los tiempos de ejecución de diferentes proveedores. Estoy de acuerdo, un programador no debería basarse en una aplicación particular de hashCode() directamente, pero cambiando potencialmente podría romper un montón de las colecciones por entregas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top