私たちのシステムは、端末からのユーザー入力を受け入れ、いくつかの既知のキーワード文字列(おそらく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;
}