хеш, который отображает строки в целые числа - PullRequest
4 голосов
/ 25 января 2012

Требуется некоторая хеш-функция для отображения строки на int со следующими ограничениями.

ограничения: одинаковые строки идут с одинаковым номером.Разные строки идут на разные номера.Во время одного запуска приложения я получаю строки одинаковой длины, только во время выполнения я знаю длину.

Есть предложения, как создать хеш-функцию?

Ответы [ 4 ]

4 голосов
/ 25 января 2012

Хеш-функция никогда не гарантирует, что два разных значения (строки в вашем случае) дают разные хеш-коды. Однако одинаковые значения всегда будут давать одинаковые хеш-коды.

Это потому, что информация теряется. Если у вас есть строка длиной 32 символа, она будет иметь 64 байта (2 байта на символ). Хэш-код int имеет четыре байта. Это неизбежно и называется столкновением.

Примечание: Dictionary<Tkey,TValue> использует внутреннюю хеш-таблицу. Поэтому он реализует стратегию разрешения столкновений. См. Обширный анализ структур данных с использованием C # 2.0 в MSDN.

Вот текущая реализация dictionary.cs .

3 голосов
/ 25 января 2012

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

3 голосов
/ 25 января 2012

Разные строки идут на разные номера.

Строк больше, чем чисел, поэтому это невозможно, не ограничивая входной набор.Вы не можете поместить n голубей в m коробки с n > m, если хотя бы в одной коробке содержится более одного голубя.

1 голос
/ 25 января 2012

Функция String.GetHashCode не подходит для ваших нужд?

...