Java 整数的hashCode的最佳实现是什么?

Java 整数的hashCode的最佳实现是什么?,java,data-structures,hashtable,hashcode,Java,Data Structures,Hashtable,Hashcode,我创建了一些用于哈希表的整数哈希代码实现,但它们似乎都不符合均匀分布。那么,假设哈希表的大小接近100,并且整数的数量级为几千,那么什么是整数的哈希代码的最佳实现呢?提前感谢。我建议“最好”的实现,不管这意味着什么,几乎可以肯定 Integer.valueOf(value).hashCode() 由于哈希表非常小,模函数将是最简单的实现,如果输入数字是随机的,那么分布也应该是随机的 public int hashCode(int x){ return x%tableSize; } 更好

我创建了一些用于哈希表的整数哈希代码实现,但它们似乎都不符合均匀分布。那么,假设哈希表的大小接近100,并且整数的数量级为几千,那么什么是整数的哈希代码的最佳实现呢?提前感谢。

我建议“最好”的实现,不管这意味着什么,几乎可以肯定

Integer.valueOf(value).hashCode()

由于哈希表非常小,模函数将是最简单的实现,如果输入数字是随机的,那么分布也应该是随机的

public int hashCode(int x){
   return x%tableSize;
}
更好的实现是使用所描述的乘法

描述了其他哈希函数,请检查它们。
希望这有帮助。

如果数据的键分布均匀,而不仅仅是将整数本身用作键。如果密钥分布不均匀,则需要修改整数,使其在所有整数的频谱中分布更均匀。如何做到这一点取决于密钥的分发方式和确切的映射实现

你确定你没有做过早的优化吗?在一个只有100个条目的映射中,如果您有一个恒定的查找时间(完全分布)或线性查找时间(每个条目都有一个关键点冲突),这其实并不重要。迭代100个项目是如此之快,在基准测试之外,您很可能不会注意到差异。如果一个列表的平均速度不比一个拥有如此小数据集的地图的平均速度快,那么进行基准测试将是非常有趣的。

因此,在X轴上有数千个值,而在Y轴上,您希望将它们“转换”到一个小得多的范围内,即数百个。很明显,你可以除以10或者得到模数,但是你也希望沿着目标范围尽可能均匀地分布它们

我想你需要一个压缩函数

例如,您可以对输入应用正弦函数并乘以哈希表的大小。周期应该有什么值?这取决于:期望的输入值越接近,周期越长(因此两个非常接近的值将产生两个非常不同的结果)。反之亦然:如果预计输入值不太接近,则一个小周期就可以了

private int hashCode(int input, int tableSize)
{
    return (int)(tableSize*Math.sin(PERIOD*input));
}

来自HASH3的终结雪崩函数:

int h = key;
h ^= h >>> 16;
h *= 0x85ebca6b;
h ^= h >>> 13;
h *= 0xc2b2ae35;
h ^= h >>> 16;

为什么不直接使用整数本身作为它自己的散列呢?如果源整数是均匀分布的,那么可以将
%100
作为散列代码应用,因为32位整数集本身是均匀分布的,我假设您有一个特定的整数子集要处理,而不是。因此,您需要考虑对特定数据及其实际分布的约束,以便设计均匀分布该子集的哈希代码。您在问题中没有提供这些信息。@a这将导致哈希表的大小过大……即使我采用hashCode%hashTableSize,这对于接近100的数字(即hashTableSize@RealSkeptic我正在为哈希表实现哈希代码。如果哈希代码被集中,哈希表就不会有效率。而且,根据的,
Integer
hashCode()
方法返回由
Integer
表示的原语
int
值。。。我不认为通用的解决方案一定是最好的。事实上,优化在于具体化而不是泛化。
int h = key;
h ^= h >>> 16;
h *= 0x85ebca6b;
h ^= h >>> 13;
h *= 0xc2b2ae35;
h ^= h >>> 16;