Я пишу продвинутый калькулятор на 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 и как можно более не сталкивающуюся хэш-функцию, чтобы заменить ту, которую я сейчас использую? Кроме того, таблица функций НЕ является полностью жестко закодированной, функция хеширования также будет использоваться для хеширования имен пользовательских функций, для которых используется другой способ проверки соответствия, но функция хешированияЯ использую то же самое.
Заранее спасибо.