Каков наилучший способ для генерации уникального целого числа без знака из строки в c ++?

Мне не нужен код (вы можете предоставить примеры в коде, если хотите), но мне нужна теория.

Давайте представим, что у меня есть следующая функция:

UINT GenerateID(const char * string);

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

GenerateID("123"); //Could result in 999
GenerateID("123"); //Must also result in 999
GenerateID("124"); //Should result in something completely different

Когда я пытаюсь сделать это сам, результаты всегда имеют примерно одинаковое количество цифр.

5

Решение

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

Посмотрите на этой странице пример того, как работает хеш SHA-1: http://hash.online-convert.com/sha1-generator

5

Другие решения

Вы смотрели в std :: hash?

http://en.cppreference.com/w/cpp/utility/hash

4

Это не может быть сделано. Предположим, что ваш int 32 бит. Текстовая строка будет сделана из ' ', a-zA-Z а также 0-9 и полдюжины знаков препинания, в общей сложности около 1 + 2 * 26 + 10 + 6 = 69 символов. Со строками из 6 символов у вас уже есть больше возможных строк, чем целочисленных значений (log (2 ^ 32) / log (69) = 5.23). использование long long 64 бит, и у вас кончились 11 символов.

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

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

Если это используется в программе, и строки могут контролироваться злоумышленником, вы подвергаетесь атаки на алгоритмическую сложность (злоумышленник может завалить вас струнами, которые сталкиваются).

1
По вопросам рекламы [email protected]