我正在使用哈希表(DotNET Dictionary对象)作为稀疏二维数据集的一部分。哈希表中的大多数条目都将靠近在一起。我最终会得到100~10,000个条目,所有条目都聚集在零附近。我已经读过,当散列遍布整个整数(32位)范围时,Hash表的性能会更好。
有没有一种廉价的方法将连续的整数映射到1:1方式的完全不同的值?我没有必要将它们映射回来,这纯粹是单向的。
答案 0 :(得分:3)
也许我误解了你在说什么,但是Dictionary已经哈希你的整数了。不应该预先哈希它们。为什么不尝试默认实现,看看它是如何进行的,而不是尝试预先优化,这很可能毫无意义。
答案 1 :(得分:1)
如果你知道你的密钥集的最大值(kmax),你可以扩展一个常数因子(乘数),比如乘以一个固定的素数,使得产品保持在最大整数大小之下(2 ^ 31 - 1) :
即。最近的素数(2^30) / kmax
注意:确保使用的素数与哈希表中的桶数不同。
这是另一个解决方案:由于.NET Random类将为同一种子生成相同的值,您可以使用它来分发传入的密钥。
答案 2 :(得分:1)
不使用Integer,而是编写一个继承自Integer的类,并重写GetHashCode函数。这样你就不必做任何事情,只需要创建这个功能!
我能想到的最简单的方法是将值均匀地分散出去:
public class MyInteger:Integer
{
public override int GetHashCode()
{
unchecked
{
return (int)Math.Pow(this,this);
}
}
}
很好,均匀分手,同时将努力降到最低。