2012-01-25 4 views
4

Ищет некоторую функцию хэша, чтобы сделать строку для сопоставления int со следующими ограничениями.хэш, который преобразует строки в целые числа

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

Любые предложения по созданию хэш-функции?

+2

Используйте метод String.GetHashCode(). – adatapost

+1

String.GetHashCode –

+0

@Yuck, string может быть любым значением ASCII –

ответ

4

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

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

Примечание: Dictionary<Tkey,TValue> использует хэш-таблицу внутри. Поэтому он реализует стратегию разрешения конфликтов. См. An Extensive Examination of Data Structures Using C# 2.0 на MSDN.

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

1

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

+3

Это не удовлетворяет невозможное требование, чтобы разные строки переходили на разные числа. – jason

+0

@ Джейсон: Верно, но высокая вероятность, гарантированная GetHashCode, может быть достаточной для требований OP. – Heinzi

+0

@Heinzi - может ли он позвонить вам, чтобы отлаживать, когда его приложение внезапно перестает работать через несколько лет? :) –

3

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

3

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

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

Смежные вопросы