Мне не нужен код (вы можете предоставить примеры в коде, если хотите), но мне нужна теория.
Давайте представим, что у меня есть следующая функция:
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
Когда я пытаюсь сделать это сам, результаты всегда имеют примерно одинаковое количество цифр.
Вы ищете хэш-функцию. Хеш-функция принимает входные данные произвольной длины и преобразует их в уникальное число (часто шестнадцатеричное).
Посмотрите на этой странице пример того, как работает хеш SHA-1: http://hash.online-convert.com/sha1-generator
Вы смотрели в std :: hash?
Это не может быть сделано. Предположим, что ваш 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 символов.
Как говорят другие ответы, вы можете использовать хэш-функция (вокруг много плавающих лотов), которые сопоставят строки с целыми числами и (будем надеяться) равномерно распределят их по выбранному диапазону целых чисел.
Есть методы для построения совершенные хэш-функции, что за фиксированный набор строк создает функцию и не слишком большой диапазон, который гарантирует отсутствие коллизий (две строки не дают одно и то же целое число).
Если это используется в программе, и строки могут контролироваться злоумышленником, вы подвергаетесь атаки на алгоритмическую сложность (злоумышленник может завалить вас струнами, которые сталкиваются).