when sirve que para metodo and java hash

sirve - object equals java



¿Utiliza Objects.hash() o la propia implementación de hashCode()? (3)

A continuación se muestra la implementación de Objects.hash , que llama Arrays.hashCode internamente.

public static int hash(Object... values) { return Arrays.hashCode(values); }

Esta es la implementación del método Arrays.hashCode

public static int hashCode(Object a[]) { if (a == null) return 0; int result = 1; for (Object element : a) result = 31 * result + (element == null ? 0 : element.hashCode()); return result; }

Así que estoy de acuerdo con @Andy. El costo de creación de estos objetos "innecesarios" puede sumar si hashCode se llama con frecuencia. Si te estás implementando, sería más rápido.

Recientemente descubrí el método Objects.hash() .

Lo primero que pensé fue que esto hashCode() mucho la implementación de hashCode() . Vea el siguiente ejemplo:

@Override //traditional public int hashCode() { int hash = 5; hash = 67 * hash + (int)(this.id ^ (this.id >>> 32)); hash = 67 * hash + (int)(this.timestamp ^ (this.timestamp >>> 32)); hash = 67 * hash + Objects.hashCode(this.severity); hash = 67 * hash + Objects.hashCode(this.thread); hash = 67 * hash + Objects.hashCode(this.classPath); hash = 67 * hash + Objects.hashCode(this.message); return hash; } @Override //lazy public int hashCode() { return Objects.hash(id, timestamp, severity, thread, classPath, message); }

Aunque debo decir que esto parece demasiado bueno para ser cierto. Además, nunca he visto este uso.

¿Hay algún inconveniente de usar Objects.hash() comparación con la implementación de su propio código hash? ¿Cuándo elegiría cada uno de esos enfoques?

Actualizar

Aunque este tema está marcado como resuelto, no dude en seguir publicando respuestas que brinden nueva información e inquietudes.


Me gustaría tratar de hacer un argumento fuerte para ambos.

Disclaimer de apertura

Para esta respuesta, Objects.hash() , Objects.hashCode() y cualquier función proporcionada por cualquier biblioteca que realice este rol son intercambiables. Primero, me gustaría argumentar, usar Objects.hash() o no usar las funciones estáticas de Objects en absoluto. Cualquier argumento a favor o en contra de este método requiere hacer suposiciones sobre el código compilado que no se garantiza que sean verdaderas. (Por ejemplo, el optimizador del compilador puede convertir la llamada a función en una llamada en línea, omitiendo así la pila de llamadas extra y la asignación de objetos. Al igual que los bucles que no hacen nada útil no llegan a la versión compilada (a menos que apague el optimizer). Tampoco tiene ninguna garantía de que las futuras versiones de Java no incluyan la versión de JVM como C # en su versión de este método (por razones de seguridad, creo). Así que el único argumento seguro que puede hacer con respecto a esta función, es que generalmente es más seguro dejar los detalles de un hash apropiado para esta función que tratar de implementar su propia versión ingenua.

Para Objects.hash

  • Garantizado para ser un buen hash.
  • Toma 5 segundos para implementar.
  • La tuya tendría un error (de alguna manera, especialmente si copió y pegó la implementación)

Contra Objects.hash

  • Los docs Java no hacen promesas sobre la compatibilidad cruzada hash (¿JVM v6 y JVM v8 darán los mismos valores? Siempre? En todo el sistema operativo?)
  • Lo que pasa con hashCodes , Funcionan mejor si están "distribuidos uniformemente". Por lo tanto, si un valor int solo es válido para el rango de 1 a 100, es posible que desee "redistribuir" sus códigos hash para que no todos formen parte del mismo segmento.
  • Si tiene algún requisito que lo haga cuestionar cómo funciona Objects.hash, confiabilidad / rendimiento, piense detenidamente si el código hash es realmente lo que desea, e implemente un método de codificación hash personalizado que satisfaga sus necesidades.

Tenga en cuenta que el parámetro de Objects.hash es Object... Esto tiene dos consecuencias principales:

  • Los valores primitivos utilizados en el cálculo del código hash deben estar this.id , por ejemplo, this.id se convierte de long a Long .
  • Se debe crear un Object[] para invocar el método.

El costo de creación de estos objetos "innecesarios" puede sumarse si hashCode se llama con frecuencia.