2012-04-20 31 views
6

que estoy teniendo dos listas de objetos, los usuarios y los productosJava 2 hash del hash

usuarios de productos propios, y cada uno de los productos está asociado a 1 usuario

sino un tipo de producto puede ser múltiples y ser de propiedad los usuarios separados

  • usuarios: ED, Rob
  • productos: Coca, sprites (1), Sprites (2), cerveza
  • Ed tiene Coca y Sprites (1), Rob Sprites (2) y abeja r

que necesito para generar un ID para cada uno único (usuario + producto)

Probablemente no es una buena idea hacer

user.hashCode() + product.hashCode() 

Lo que podría ser una buena manera de proceder?

+0

relacionadas: http://stackoverflow.com/questions/2587442/hash-code-for-a-group-of-three-fields – Thilo

+2

'(37 * (17 + user.hashCode) + product.hashCode()) '. Tomado de Java efectivo. –

+3

Los códigos Hash no son únicos. Los objetos iguales devuelven el mismo código hash, pero el mismo código hash no significa que los objetos sean iguales. No confundas hashcode con una ID. –

Respuesta

7

Su hashCode no es tan malo si el usuario y el producto crean códigos hash pseudoaleatorios. Si usted tiene miedo de las colisiones de condensación debido a las malas implementaciones hashCode en cualquiera user o product, luego multiplicar uno de los códigos hash fuente por un número primo:

public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((product == null) ? 0 : product.hashCode()); 
    result = prime * result + ((user == null) ? 0 : user.hashCode()); 
    return result; 
} 

Eclipse se basa este mismo código al seleccionar Fuente | Genera hashCode() y es igual a().

Según lo mencionado por Thilo, también puede simplemente usar Arrays.hashCode(new Object[]{ user, product }); Esta llamada se ocupa de los valores null para usuario o producto y también multiplica el resultado por 31, igual que el código escrito a mano. Si usa Google Guava, hay un Objects.hashCode(Object...) que hace que su intención sea un poco más clara y usa varargs, pero también solo delega en Arrays.hashCode.

+0

así que aquí está usando el mismo número primo que el multiplicador de usuario y producto, ¿por qué no tomar 2 diferentes? –

+1

@ ca11111 ya hay una publicación en stackoverflow que responde mucho mejor que nunca: http://stackoverflow.com/a/1147232/112964 –

1

Una solución común es multiplicar el primer hash con un número primo y luego agregar el segundo hash.

4

Puede dejar que Apache Commons HashCodeBuilder haga el trabajo por usted.

Se le permite escribir algo así como

return new HashCodeBuilder(17, 37). 
    append(user). 
    append(product). 
    toHashCode();