确定硬编码哈希表的固定哈希函数的好方法是什么?

时间:2017-01-04 20:34:21

标签: algorithm hash

通常我发现自己需要一个哈希表,其值在编译时是已知的,并且已知永远不会改变。

我想知道是否有一种标准方法来生成一个定制算法,该算法仅用于特定的哈希表,因此不需要在运行时构造它,并确保没有冲突。

这种最差的算法只是做一系列if语句,但这种方法会破坏O(N)的性质。

我想知道是否存在一些现有算法,用于将固定数量的唯一字符串映射到从0到唯一字符串数的索引。

例如;我可能有一个哈希表

{
    "one": "1",
    "two": "2", 
    "three": "3"
}

创建这样一个硬编码表的一个天真的尝试就是使用一个内部表条对来创建一个函数,并产生一些任意的歧视,例如下面的一个。

#include <stdio.h>
#include <string.h>
#include <math.h>

static const char *my_hash(const char *input)
{   
    const struct {
        const char *key;
        const char *value;
    } h_table[] = {
        {"three", "3"},
        {"one", "1"},
        {"two", "2"}
    };

    int hash;
    int len = strlen(input);

    if (len != 3 && len != 5) {
        return (char *)0;
    }        

    hash = (int)ceil((((input[1] - 102) / 4) - 1) / 2.0);    

    return h_table[hash].value;
}

int main(int argc, char **argv)
{
    puts(my_hash("one"));
    puts(my_hash("two"));
    puts(my_hash("three"));

    return 0;
}

是否有用于生成此类算法的已知算法?

总结:有没有一种已知的算法可以将N个不同的字符串映射到从0到N-1的N个不同的整数?

我觉得这样的事情已经存在。

1 个答案:

答案 0 :(得分:1)

这些被称为minimal perfect hash functions,并且确实存在用于查找它们的已知算法。我个人不知道算法,但这没关系。现有的库可以为您完成。

CMPH适用于为大量密钥找到最小的完美哈希函数。

gperf侧重于少量键的哈希评估速度,其中完美哈希函数不需要最小(因此表中可能存在一些空白空间)。