vulnerability example array java object hashcode

java - example - ¿Cómo funcionan hashCode() y identityHashCode() en el back-end?



object tostring java (4)

identityHashCode

public static int identityHashCode (Object x)

Devuelve el mismo código hash para el objeto dado como lo devolvería el método predeterminado hashCode () , independientemente de si la clase del objeto dado anula hashCode (). El código hash para la referencia nula es cero.

Ver [ documentos de Java ]

Entonces, si alguien ha anulado el método hashCode() en su clase pero aún quiere el valor predeterminado hashCode() que habría sido devuelto por Object hashCode() entonces use System.identityHashCode()

Por lo tanto, hashCode() llama internamente a System.identityHashCode() siempre que no lo anule en su clase, si invalida hashCode () llamará a su implementación.

¿Cómo funcionan Object.hashCode() y System.identityHashCode() en el back-end? ¿ identityHashCode() devuelve la referencia del objeto? ¿ hashCode() depende de? del objeto? == operador cómo trabajar en back-end.

¿Cuál es la diferencia entre hashCode() e identityHashCode() ?


¿Cómo funcionan Object.hashCode () y System.identityHashCode () en el back-end?

Asumiendo que no ha sido anulado, el método Object.hashCode() simplemente llama a System.identityHashCode(this) .

El comportamiento exacto de System.identityHashCode(Object) depende de la implementación de JVM. (La implementación real en las JVM de Hotspot recientes es bastante inteligente, pero estoy divagando).

¿ identityHashCode() devuelve la referencia del objeto?

No. Devuelve un int , y un int no puede contener una referencia. (¡Duh!)

Ese entero devuelto por identityHashCode puede estar relacionado con la (a) dirección de la máquina para el objeto, o puede no ser 1 . Se garantiza que el valor devuelto por identityHashCode() no cambiará durante la vigencia del objeto. Esto significa que el GC reubica un objeto (después de una llamada a identityHashCode() ) y luego no puede usar la dirección del nuevo objeto como hashcode de identidad.

¿HashCode () depende de ? del objeto ? == ? == operador cómo trabajar en back-end.

Esto no tiene sentido. No hay ? == ? == o ?== operador en Java.

¿Cuál es la diferencia entre hashCode () e identityHashCode ()?

Esto se explica en parte anteriormente. Otras diferencias incluyen:

  • El método hashcode() es un método de instancia no final, y debe ser anulado en cualquier clase donde se equals(Object) el valor equals(Object) . Por el contrario, identityHashCode(Object) es un método static y, por lo tanto, no se puede anular.

  • El método identityHashCode(Object) le proporciona un identificador para un objeto que puede (en teoría) usarse para otras cosas además de las tablas hash y hash. (Desafortunadamente, no es un identificador único , pero se garantiza que nunca cambiará durante la vida del objeto).

1 - Para JVM de generación actual, no está relacionado con la dirección de memoria en absoluto. Ver la respuesta de @ bestsss.


Esto es más o menos específico de la implementación. La única garantía que obtienes es

Tanto como sea razonablemente práctico, el método hashCode definido por el Object clase devuelve enteros distintos para objetos distintos. (Esto se implementa típicamente al convertir la dirección interna del objeto en un entero, pero esta técnica de implementación no es requerida por el lenguaje de programación Java TM ).

(Desde Java 1.6 JavaDoc)

En teoría, esto significa que los valores podrían determinarse arbitrariamente e incluso podrían ser cero para cada objeto. En la práctica, es probablemente algo derivado de la dirección del objeto. Por supuesto, debes tener cuidado con esto. La JVM puede reubicar objetos si cree que es una buena idea durante una recolección de basura, por lo que no será "solo" la dirección de memoria. Se puede extraer de un contador global, o un hash de la ubicación del objeto original, o de un generador de números aleatorios, etc.


identityHashCode () funciona de esa manera ( y a partir de ahora no tiene nada que ver con la dirección, especialmente porque las direcciones son de 64 bits de largo, está bien alineada, por lo que 61 )

Comprueba si ya hay uno generado, si es así, lo devuelve. Puede suponer que hay un lugar en el encabezado del objeto para ese int ;

de lo contrario: genera un número aleatorio ( iirc twister Marsaglia shift-xor algoritmo), cada subproceso nativo tiene su propia semilla, por lo que no hay información compartida. CAS el campo identityHashCode en el encabezado del objeto para actualizar con el nuevo número generado. si CAS success devuelve el valor, si no, el campo ya contiene un identityHashCode generado.

usted puede ver el resto de las respuestas sobre anulación de hashcode.

línea de fondo: si el javadoc todavía dice algo acerca de las direcciones y identityHashCode, alguien necesita actualizarlo.