我想知道如何在Java中散列一个double?我已经散列了其他原始数据和对象。我以为我可以使用哈希码方法?从我所看到的,这看起来非常复杂。我遇到了一些关于创造种子的事情。
我想知道如何解决这个问题。希望将我的哈希码的其余部分放入具有double的类中?
我想知道在尝试在java中散列arraylists,数组和其他对象时是否存在问题。我的一些课程包含了arraylists。
非常感谢
答案 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();