C中的“编译时哈希表”

时间:2014-03-30 12:37:23

标签: c hashtable compile-time

我在C中实现了一个像这样的逻辑(对于解释器):

if <input string> in <list of pre-defined constant strings>
  do_a_predefined_action()
else
  do_something_else(<input string>)

我的第一个想法是哈希表,但是如果在编译时知道常量字符串,那么在运行时手动初始化哈希表似乎有点浪费。

其他想法我已经包括静态初始化具有已知哈希(ick ...)的哈希表结构,然后像普通一样简单地使用它。另一个是一个庞大的嵌套switch块,可以提供O(log n)查找时间(不像哈希表那么快)。

实现预定义字符串集的查找的最佳方法是什么?我还没有看到什么解决方案?优雅优于速度。

2 个答案:

答案 0 :(得分:3)

我不会太担心在程序启动时初始化哈希表的成本。这种过早优化的臭味。那说,......

由于您确实知道所有字符串,因此您可以考虑为这些字符串构建完美哈希。您可以使用一些工具来尝试许多可能的散列算法,并选择最适合数据的算法。这将导致静态初始化路由。虽然您已评论过#34; ick&#34;关于这个策略。如果速度问题非常重要,我建议你重新考虑一下。


我实际上在我的postscript解释器的上下文中考虑了这个问题,它在启动时初始化systemdict哈希表。另一个需要考虑的方法是将表缓存在一个文件中。用于初始化的伪代码将是这样的:

check for cached file
if file exists,
    load it.
if file does not exist,
    initialize table manually.
    save table to file.

答案 1 :(得分:2)

您可以使用gperfBob Jenkin's Minimal Perfect Hash代码生成一个(可能是最小的)Perfect Hash Function,它会将字符串映射到值,您可以稍后switch