2012-03-10 13 views
9

Me preguntaba cómo hash un doble en Java? He procesado otros datos y objetos primitivos. Pensé que podría usar el método de código hash? Por lo que he visto, esto parece bastante complejo. Me encontré con algo sobre crear una semilla.Hash a double en Java

Me preguntaba cualquier idea sobre cómo hacerlo. ¿Esperando ponerme con el resto de mi código hash para la clase que tiene el doble?

Me preguntaba si hay problemas conmigo para intentar hash arraylists, arrays y otros objetos en java. Algunas de mis clases contienen listas de arreglos.

Muchas Gracias

Respuesta

20

Double.hashCode() compleja? Básicamente convierte double en un long (no hay magia aquí, después de todo, ambos son simplemente valores de 64 bits en la memoria) y el cálculo de hash long es bastante simple. La conversión double ->long se realiza a través del public static doubleToLongBits(). ¿Qué es complejo acerca de esto?

Ejemplos:

Double.valueOf(42.5).hashCode();  //better answer to everything 

Long.valueOf(Double.doubleToLongBits(42.5)).hashCode(); 
+0

Hola Tomasz, probé el código hash en el doble y obtuve el siguiente mensaje no puede ser dereferenced. Estoy ejecutando el método hashcode() en getClassMethod() es decir .getClassMethod(). HashCode(); GetClassMethod devuelve el doble. – daveb

+0

@daveb: eche un vistazo a los ejemplos que acabo de agregar a mi respuesta. –

+0

Gracias @Thomasz, hice int hash6 = Double.valueOf (this.getClassMethod()). HashCode(); y se compiló sin el problema anterior. ¿La línea de código está bien para ti? Cheers DaveB – daveb

2

Dependiendo de lo que necesita esta para, usted podría ir con un enfoque muy simple de poco mod (ing) de ella.

int hash(double d) { 
    return d % 71; //use a prime number here 
} 

Si solo sirve para almacenar unos cuantos dobles en hash, esto debería hacerlo. Si desea expandir el hash, simplemente aumente el "71"

+0

Este es un hash pobre, devolverá el mismo valor para los dobles cerca uno del otro. ¿Y si su programa solo necesita duplicar entre 0 y 1? Hash constante. –

+0

Estoy recopilando todos los campos de las clases diff, y reemplazando hashcode, equal y string para todas mis clases. De modo que puedo comparar objetos de ellos y también me aseguro de que los objetos también sean únicos. He estado usando 31 números primos y concatenando los códigos hash en 1. Mi doble es por el precio de un artículo. DaveB – daveb

+1

@TomaszNurkiewicz totalmente de acuerdo! Es por eso que comencé con "dependiendo de para qué necesita esto". Si "sabía" que sus valores estaban todos entre 0 y 1, debería usar algo más. – krico

2

La forma en que Java lo hace es convertir el bit sin procesar de un doble en un largo.

// from Double. 
public static long doubleToLongBits(double value) { 
    long result = doubleToRawLongBits(value); 
    // Check for NaN based on values of bit fields, maximum 
    // exponent and nonzero significand. 
    if (((result & DoubleConsts.EXP_BIT_MASK) == 
      DoubleConsts.EXP_BIT_MASK) && 
     (result & DoubleConsts.SIGNIF_BIT_MASK) != 0L) 
     result = 0x7ff8000000000000L; 
    return result; 
} 

public int hashCode() { 
    long bits = doubleToLongBits(value); 
    return (int)(bits^(bits >>> 32)); 
} 

Nota: Hay muchos valores de NaN (y dos tipos) pero Java los trata como todos lo mismo.

1

Esto se trabajó para mí

int h2 = new Double(area).hashCode();