java - sirve - Por qué el objeto#hashCode() devuelve int en lugar de largo
metodo equals string java (3)
Asumiría que es un equilibrio entre el costo de cálculo y el rango de hash. Se hace referencia a los Hashcodes con tanta frecuencia que costar el doble de datos cada vez que necesite un hash sería costoso, especialmente si considera casos de uso más comunes:
por ejemplo, si crea un hash pequeño con 10, 100 o 1000 valores, la diferencia en el número de colisiones de hash que va a ver será extremadamente insignificante. Para hashes más grandes, ... bueno, piense en cuán grande tendrá que ser un hash para los valores de 10 ** 32 para comenzar a tener colisiones frecuentes, y si eso es posible hacerlo en una JVM dada la cantidad de memoria que necesitaría .
Por qué no:
public native long hashCode();
en lugar de:
public native int hashCode();
¿Por mayor posibilidad de lograr códigos hash únicos?
De todos modos, el valor del código hash se usará para determinar un número de filas en una tabla que es un valor relativamente pequeño.
En HashMap
, por ejemplo, la tabla predeterminada contiene 256 filas y solo 16 filas (Sun JDK 1.6.0_17). Esto significa que el número de fila se determina de la siguiente manera:
int rowNumber = obj.hashCode() % rowsCount;
Por lo tanto, la distribución real es de 0 a rowsCount
.
UPD : Recuerdo la implementación de ConcurrentHashMap
. En pocas palabras, ConcurrentHashMap
contiene muchas tablas relativamente pequeñas. Al principio, la función hashCode
se usa para determinar el número de la tabla, y luego se usa la misma función para determinar una fila en la tabla seleccionada.
Este enfoque elimina la limitación del tamaño de la matriz (e incluso permite crear una tabla hash distribuida).
Por lo tanto, me hashCode
la conclusión de que hashCode
devuelve int
porque cubre la gran mayoría de los casos de uso.
Porque la longitud máxima de una matriz es Integer.MAX_VALUE
.
Dado que el uso principal de hashCode()
es determinar en qué ranura insertar un objeto en la matriz de respaldo de un HashMap
/ Hashtable
, un hashcode> Integer.MAX_VALUE
no podría ser almacenado en la matriz.