【发布时间】:2010-08-16 11:59:07
【问题描述】:
我正在用 C 语言编写一个高级计算器。您可以猜到,它目前有许多功能,并且我使用一个开关对每个功能名称进行正确的操作。它是这样的:
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。
有人可以推荐一个 fast 和 simple,并且尽可能不冲突的散列函数来替换我现在使用的散列函数吗? 此外,函数表不是完全硬编码的,散列函数也可用于对用户定义函数的名称进行散列,对此使用了不同的检查匹配方式,但散列函数我用的是一样的。
提前致谢。
【问题讨论】:
-
该链接中的发帖人对散列固定表的散列函数感兴趣,但在我的情况下,用户可以添加新函数,因此表不是完全静态的(对于这些,使用了不同的机制,switch 用于硬编码的机制)。编辑帖子以澄清这一点。
-
没有像非冲突哈希函数这样的东西。也许你的意思是映射函数。
-
短函数名称(如 sin & cos)使用 strcmp 比使用哈希表查找更快,因为您必须在公式中函数名称的每次出现时生成哈希值
-
自定义函数名的长度有什么限制? (如果没有,那么除非散列函数的结果也是无限长的,否则你不能有这样的函数。
标签: c performance hash switch-statement