在Java中散列一个double



我想知道如何在Java中散列double?我已经散列了其他原始数据和对象。我想我可以使用hashcode方法?据我所见,这看起来相当复杂。我偶然发现了一些关于创造种子的东西。

我想知道该怎么做。希望将我的其余哈希代码放在具有双精度的类中?

我想知道在java中散列数组列表、数组和其他对象是否有问题。我的一些类包含数组列表。

非常感谢

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();

根据您的需要,您可以使用一种非常简单的方法来修改它。

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

如果它只是用于在散列中存储几个doubles,那么这应该可以做到。如果你想传播散列,只需增加"71"

Java的方法是将double的原始位转换为long。

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

相关内容

最新更新