Хэш двойник в Java - PullRequest
       56

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

12 голосов
/ 11 марта 2012

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

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

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

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

Ответы [ 4 ]

21 голосов
/ 11 марта 2012

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

Примеры:

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

Long.valueOf(Double.doubleToLongBits(42.5)).hashCode();
2 голосов
/ 11 марта 2012

В 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 рассматривает их как все одинаковые.

2 голосов
/ 11 марта 2012

В зависимости от того, для чего вам это нужно, вы можете использовать очень простой подход - просто модифицировать его.

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

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

1 голос
/ 09 декабря 2013

Этот работал для меня

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