【问题标题】:(almost) Non-colliding simple hashing function for use in a switch(几乎)用于开关的非冲突简单散列函数
【发布时间】: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;
}

它过去做得很好,而且速度非常快。然而,现在计算器越来越扩展,用户也可以定义自己的函数和变量,冲突变得非常明显——例如conddotp都哈希到612。

有人可以推荐一个 fastsimple,并且尽可能不冲突的散列函数来替换我现在使用的散列函数吗? 此外,函数表不是完全硬编码的,散列函数也可用于对用户定义函数的名称进行散列,对此使用了不同的检查匹配方式,但散列函数我用的是一样的。

提前致谢。

【问题讨论】:

  • 该链接中的发帖人对散列固定表的散列函数感兴趣,但在我的情况下,用户可以添加新函数,因此表不是完全静态的(对于这些,使用了不同的机制,switch 用于硬编码的机制)。编辑帖子以澄清这一点。
  • 没有像非冲突哈希函数这样的东西。也许你的意思是映射函数。
  • 短函数名称(如 sin & cos)使用 strcmp 比使用哈希表查找更快,因为您必须在公式中函数名称的每次出现时生成哈希值
  • 自定义函数名的长度有什么限制? (如果没有,那么除非散列函数的结果也是无限长的,否则你不能有这样的函数。

标签: c performance hash switch-statement


【解决方案1】:

如果您正在寻找哈希函数,请查看 Paul Hseih' PageBob Jenkins' Page(这是黄金)关于哈希,尽管我个人通常使用 Murmur2 进行哈希(带有一些不同的种子),与正确的种子,使用 32 位输出不会得到很多(如果有任何冲突),甚至更少(基本上没有,除非你故意破坏哈希)使用 64 位版本(虽然我没有测试 16 位)。

至于你的问题,如果你使用某种形式的二叉搜索树来查找函数可能会更容易,因为有用户定义的函数(trie 甚至可以工作)

【讨论】:

    【解决方案2】:

    您可以使用树进行查找。它们没有碰撞。

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多