Хэш двойной в 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 рассматривает их как все то же самое.