C语言中的散列数组技巧

时间:2011-04-24 23:24:09

标签: c hashtable

我需要一些想法来为我的作业开发一个好的散列函数。我列出了世界上所有国家(大约190个)的总数。每个国家/地区的名称是散列函数的关键。有没有特定类型的散列函数,任何人都会建议将这些数据存储在散列函数中而不会发生很多冲突?另外,您是否可以举例说明如何实施它?

3 个答案:

答案 0 :(得分:2)

使用GNU gperf。对于像你这样的输入,它会为你生成C代码,它实现了一个完美的哈希函数(对于给定的输入)。没有碰撞,没有后顾之忧。

答案 1 :(得分:2)

您可以使用生成的完美哈希(GNU perf)。

如果字符串集是动态的,那么你可以使用三元组。 对于N个唯一字符串,它将为您提供唯一的数字[1..N]。对于您的情况,它将比使用哈希表更快。 这是我实现的这样的事情: http://code.google.com/p/tiscript/source/browse/trunk/tool/tl_ternary_tree.h

答案 2 :(得分:0)

我能想到的最简单的方法是为每个国家/地区的名称计算其表示中ASCII值的总和,并将其用作哈希值:

int hash(const char *s)
{
    int h = 0;

    while (s && *s)
          h += *s++;

    return h;
}

如果您的哈希地图的大小为N,则使用map[hash(my_country) % N] = my_country存储国家/地区名称。从概念上讲。

尝试这种方法,看看生成的哈希值是否足够均匀分布。请注意,分布的质量也可能取决于N。