将整数映射到整个范围

时间:2009-09-19 05:09:55

标签: mapping integer range

我正在使用哈希表(DotNET Dictionary对象)作为稀疏二维数据集的一部分。哈希表中的大多数条目都将靠近在一起。我最终会得到100~10,000个条目,所有条目都聚集在零附近。我已经读过,当散列遍布整个整数(32位)范围时,Hash表的性能会更好。

有没有一种廉价的方法将连续的整数映射到1:1方式的完全不同的值?我没有必要将它们映射回来,这纯粹是单向的。

3 个答案:

答案 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);
       }
    }
}

很好,均匀分手,同时将努力降到最低。