(почти) Простая функция хэширования без коллизий для использования в коммутаторе - PullRequest
3 голосов
/ 16 августа 2010

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

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 16 августа 2010

Если вы ищете хэш-функции, взгляните на Paul Hseih 'Page и Bob Jenkins' Page (это золото) на хеширование, хотя лично я обычно использую Murmur2 для хэширования (с некоторыми различными начальными значениями) с правильным начальным числом вы не получите много (если есть коллизии), используя 32-битный вывод, или даже меньше (в основном, ни одного, если вы не намеренно подрываете хеш) использование 64-битной версии (хотя я не тестировал 16-битные).

Что касается вашей проблемы, может быть проще, если вы используете какую-либо форму двоичного дерева поиска для поиска функций, видя, что есть определенные пользователем функции(Три может даже работать)

0 голосов
/ 16 августа 2010

Вы можете использовать деревья для поиска.У них нет столкновений.

...