我们的系统需要接受来自终端的用户输入并匹配几个已知的关键字字符串(可能是 10 个)。
我们没有空间/计算机来做正则表达式等,代码需要小而快。
现在,这样做的讨厌的方法是:
// str is null-terminated, assume we know it's safe/sane here
if(!strncmp(str,"hello",5)
{
do_hello();
}
else if(!strncmp(str,"world",5)
{
do_world();
}
else
{
meh(); // Wasn't a match
}
因此,经过一番谷歌搜索和阅读后,我确信更好的方法是将各种匹配项的哈希值预先计算为 int,然后使用 case 语句:
// Assume hash() stops at NULL
switch(hash(str))
{
case HASH_OF_HELLO:
do_hello();
break;
case HASH_OF_WORLD:
do_world();
break;
default:
meh();
break;
}
我们可以在编译时计算 *HASH_OF_match*。这似乎是一种从相对较小的集合中选择字符串的更快/更优雅的方式。
那么——这看起来合理吗?/ 这样做有明显的问题吗?/ 有人有更优雅的方法吗?
作为一个脚注,这是我今天下午看到的最好看的哈希算法;),归功于 dan bernstein,它看起来很适合手头的工作。
unsigned int
get_hash(const char* s)
{
unsigned int hash = 0;
int c;
while((c = *s++))
{
// hash = hash * 33 ^ c
hash = ((hash << 5) + hash) ^ c;
}
return hash;
}