针对特定数据结构的无冲突哈希函数

时间:2010-04-21 20:32:01

标签: algorithm data-structures hash-function

是否可以为具有特定属性的数据结构创建无冲突哈希函数。

  1. 数据结构为int [] [] []
  2. 它不包含重复项
  3. 定义了包含在其中的整数范围。假设它是0..1000,最大整数绝对不大于10000。
  4. 大问题是这个哈希函数也应该非常快。 有没有办法创建这样的哈希函数?也许在运行时取决于整数范围?

    附加:我应该说这个哈希函数的目的是要快速检查是否处理了特定的组合。因此,当处理数据结构中的某些数字组合时,我会计算哈希值并存储它。然后,当处理数据结构中的另一个数字组合时,我将比较散列值。

3 个答案:

答案 0 :(得分:6)

我认为你想要的是一个“完美的哈希”,甚至是“最小的完美哈希”:

http://en.wikipedia.org/wiki/Perfect_hash_function

编辑:那就是说,如果你确定并且肯定你永远不会超过[0 ... 1000]并且根据你需要做什么,你可能只是简单地将你的结果直接“打包”在一个数组中。如果你没有很多元素,那么该数组将是稀疏的(因此有点浪费),但最多1001个元素来自[0 ... 1000]一个Object [1001](或int [1001]或无论如何都可能。

答案 1 :(得分:0)

如果您只使用64位值并将层次结构的每个级别中的位置存储到位的一部分中该怎么办?

类似的东西(在我的头顶):hash = (a << 34) | (b << 17) | (c)

答案 2 :(得分:0)

完美的哈希可能不可行,因为为您的数据集找到一个可能需要大量的计算时间。

bool[][][]会对您有用吗,true表示某个x,y,z组合是否已经处理完毕?下面是三维位阵列的原型。由于Int32的限制,这将只能达到大约1,024的最大索引(但是将适合128 MB)。您可以通过创建BitArray [] []来达到10,000。但是,这在大小上可能不实用,因为它会占用超过116 GB的RAM。

根据您确切的问题大小和需求,一个普通的旧哈希表(带有冲突)可能是您最好的选择。也就是说,这是原型代码:

public class ThreeDimensionalBitArray
{
    // todo: consider making the size configurable
    private const int MAX_INDEX = 1000;

    private BitArray _bits = new BitArray(MAX_INDEX * MAX_INDEX * MAX_INDEX);

    public bool this[int x, int y, int z]
    {
        get { return _bits[getBitIndex(x, y, z)]; }
        set { _bits[getBitIndex(x, y, z)] = value; }
    }

    public ThreeDimensionalBitArray()
    {
    }

    private static int getBitIndex(int x, int y, int z)
    {
        // todo: bounds check x, y, and z

        return (x * MAX_INDEX * MAX_INDEX) + (y * MAX_INDEX) + z;
    }
}


public class BitArrayExample
{
    public static void Main()
    {
        ThreeDimensionalBitArray bitArray = new ThreeDimensionalBitArray();
        Console.WriteLine(bitArray[500, 600, 700]); // "false"
        bitArray[500, 600, 700] = true;
        Console.WriteLine(bitArray[500, 600, 700]); // "true"
    }
}