我正在用C语言编写一个高级计算器。正如您所猜测的那样,它目前有许多功能,并且我使用switch语句为每个函数名称执行适当的操作。大致如下:
switch(hash_of(function_name_currently_being_parsed))
{
case HASH_COS:
// do something
break;
case HASH_SIN:
// do something else
break;
// etc.
}
到目前为止,我一直使用在互联网上找到的这个简单函数来进行哈希:
#define NHASH 29989
#define MULT 31
unsigned int simple_hash(char *p)
{
unsigned int h = 0;
for(; *p; p++)
h = MULT * h + tolower(*p);
return h % NHASH;
}
以前它的工作很好,速度也非常快。然而,现在计算器越来越多,用户也可以定义自己的函数和变量,碰撞变得非常明显——例如cond
和dotp
都散列到612。
有人能推荐一个快速、简单且尽可能避免碰撞的哈希函数来替换我现在正在使用的那个吗?此外,函数表并不是完全硬编码的,哈希函数也将用于哈希用户定义函数的名称,对于这种情况,使用了不同的匹配检查方式,但我使用的哈希函数是相同的。
提前致谢。