如何创建高效的静态哈希表?

时间:2011-06-10 20:43:46

标签: hashtable data-oriented-design

我需要从中创建中小型静态哈希表。通常,这些将有5-100个条目。创建哈希表时,所有键哈希都是预先知道的(即键已经是哈希值。)目前,我创建了一个HashMap,这是我对键进行排序所以我得到O(log n)查找3-5平均查找我关心的尺寸。 Wikipedia声称带有链接的简单哈希表将导致平均3次查找完整表,所以这对我来说还不值得给我带来麻烦(即将哈希%n作为第一个条目并进行链接。)鉴于我知道前面的所有哈希值,似乎应该有一个简单的方法来获得快速,静态的完美哈希 - 但我找不到一个好的指针如何。即分摊O(1)访问没有(少?)额外开销。我该如何实现这样的静态表?

内存使用很重要,因此我需要存储的越少越好。

编辑:请注意,如果我必须手动解决一次碰撞,那就没问题了。即如果我能做一些平均有直接访问的链接,例如最坏情况3的间接,那很好。这不是我需要一个完美的哈希。

3 个答案:

答案 0 :(得分:3)

对于c或c ++,您可以使用gperf

  

GNU gperf是一个完美的哈希函数生成器。对于给定的字符串列表,它以C或C ++代码的形式生成散列函数和散列表,用于根据输入字符串查找值。哈希函数是完美的,这意味着哈希表没有冲突,哈希表查找只需要一个字符串比较。

     

GNU gperf是高度可定制的。可以选择生成C或C ++代码,用于发出switch语句或嵌套ifs而不是散列表,以及调整gperf使用的算法。

答案 1 :(得分:3)

使用预处理器在没有外部lib的情况下,C中也可以使用小哈希,例如:

swich (hash_string(*p))
{
case HASH_S16("test"):
    ...
    break;
case HASH_S256("An example with a long text!!!!!!!!!!!!!!!!!"):
    ...
    break;
}

查看代码@ http://www.heeden.nl/statichashc.htm

答案 2 :(得分:0)

您可以使用Sux4j在Java或C ++中生成最小完美哈希。 (我不确定你是使用Java,但是你提到了HashMap,所以我假设。)对于C,你可以使用cmph库。