Подтвердить что ты не робот

Минимальная хэш-функция для C?

Я не могу использовать boost: hash, потому что я должен придерживаться C и не могу использовать С++.

Но мне нужно хэшировать большое количество (от 10 К до 100 тыс.) строк токенов (от 5 до 40 байтов), чтобы поиск в них был самым быстрым.

MD5, SHA1 или любая длинная хеш-функция кажутся слишком тяжелыми для простой задачи, я не занимаюсь криптографией. Кроме того, стоимость хранения и вычислений.

Поэтому мой вопрос:

  • Какой может быть самый простой алгоритм хэширования, который обеспечит предотвращение столкновений в большинстве практических случаев.

  • Сколько бит используется для хэш-значения? Я разрабатываю 32-битные системы. Использует ли хэш-алгоритм в Perl/Python 32-битные хэши? Или мне нужно перейти на 64?

  • Что касается реализации хэш-таблиц на обычных языках сценариев: проверяет ли реализация на наличие конфликтов или я могу вообще избежать этой части?

4b9b3361

Ответ 1

Вы можете найти хорошую (и быструю) хеш-функцию и интересное прочитать в http://www.azillionmonkeys.com/qed/hash.html

Единственный раз, когда вы не должны проверять наличие коллизий, - если вы используете идеальный хеш - старую старую таблицу поиска, например gperf.

Ответ 2

  • Здесь - хороший обзор наиболее известных известных хеш-функций.

  • 32 бита должны работать нормально.

  • Вам всегда нужно проверять наличие конфликтов, если вы не хотите писать забавную хеш-таблицу:)

Ответ 3

Общая хэш-функция для поиск хэш-таблицы. Он указывает НЕ использовать для криптографических целей, но так как вы указали, что у вас нет намерения, тогда вы должны быть в порядке.

Включено Обзор хэш-функций, чтобы опробовать

Ответ 4

Если вы находитесь в системе posix и придерживаетесь простой C, я бы просто использовал то, что система уже может предложить. man 3 hcreate предлагает вам все подробности или вы можете найти онлайн-версию здесь http://linux.die.net/man/3/hcreate

Ответ 5

Попробуйте Adler32 для длинных строк или Murmur2 для коротких строк.

Ответ 6

xxhash - довольно быстрый и простой вариант. Простой код использовал бы функцию XXH32:

unsigned int XXH32 (const void* input, int len, unsigned int seed);

Это 32-битный хеш. Поскольку len - int, для больших данных больше, чем 2^31-1 байты, используйте следующие:

void*         XXH32_init   (unsigned int seed);
XXH_errorcode XXH32_update (void* state, const void* input, int len);
unsigned int  XXH32_digest (void* state);