我想知道如何在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();