Хэш двойной в Java

Мне было интересно, как хэшировать двойной на Java? Я хэшировал другие примитивные данные и объекты. Я думал, что могу использовать метод hashcode? От того, что я видел, это выглядит довольно сложным. Я наткнулся на кое-что о создании семени.

Мне было интересно, какие идеи о том, как это сделать. Надеясь поставить с остальной частью моего хэш-кода для класса, который имеет двойной?

Мне было интересно, есть ли проблемы со мной, пытаясь хэшировать arraylists, массивы и другие объекты в Java. Некоторые из моих классов содержат arraylists.

Большое Спасибо

4 ответов


Double.hashCode() комплекс? Он в основном преобразует double на long (здесь нет магии, ведь они оба просто 64-битные значения в памяти) и вычислительные long хэш-довольно просто. The double ->long преобразование выполняется через public static doubleToLongBits(). Что в этом сложного?

примеры:

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

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

в зависимости от того, для чего вам это нужно, вы можете пойти с очень простым подходом просто mod(ing).

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

Если это просто для хранения нескольких двойников в хэше, это должно сделать это. Если вы хотите распространить хэш, просто увеличьте "71"


путь Java делает это, чтобы преобразовать необработанный бит двойника в длинный.

// 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));
}

примечание: там много значений NaN (и двух типов), но Java рассматривает их как все то же самое.


это сработало для меня

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