在Java中使用Hash加倍

时间:2012-03-10 22:37:42

标签: java object double hashcode primitive-types

我想知道如何在Java中散列一个double?我已经散列了其他原始数据和对象。我以为我可以使用哈希码方法?从我所看到的,这看起来非常复杂。我遇到了一些关于创造种子的事情。

我想知道如何解决这个问题。希望将我的哈希码的其余部分放入具有double的类中?

我想知道在尝试在java中散列arraylists,数组和其他对象时是否存在问题。我的一些课程包含了arraylists。

非常感谢

4 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:2)

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

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

如果只是为了在哈希中存储一些双打,那么应该这样做。 如果你想传播哈希,只需增加“71”

答案 2 :(得分:2)

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将它们视为完全相同。

答案 3 :(得分:1)

这个对我有用

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