C ++ reinterpret_cast, делая уникальный номер - PullRequest
1 голос
/ 09 октября 2011

В последнее время я использую код для создания уникального числа int для своих классов.

Я использовал reinterpret_cast<int>(my_unique_name), где my_unique_name - это переменная char [] с уникальным значением.Примерно так:

const char my_unique_name[] = "test1234";

int generate_unique_id_from_string(const char *str)
{
  return reinterpret_cast<int>(str);
}

У меня вопрос, является ли сгенерированный int действительно уникальным для всех строк ввода?

Ответы [ 3 ]

7 голосов
/ 09 октября 2011

Нет, это не так.Вы преобразуете адрес строки, а не ее содержимое.

Чтобы создать числовое значение на основе ввода строки, используйте функцию hash .Однако это не создает действительно уникальное число из-за так называемого принципа pigeonhole .

3 голосов
/ 09 октября 2011

Это будет зависеть.Вот моя интерпретация вашего вопроса:

Вы пытаетесь присвоить разные строки каждой строке.И идентичные строки из разных источников будут иметь разные идентификаторы.

Случай 1:

Если str окажется буфером многократного использования, который вы используете для чтения этих строк откуда угодно.Тогда у них у всех будет один и тот же базовый адрес.Так что нет, не будет уникальным.

Случай 2:

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

РЕДАКТИРОВАТЬ:

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

0 голосов
/ 09 октября 2011

Может быть не всегда уникальным,

id1 = generate_unique_id_from_string("test12344444444444444");
id2 = generate_unique_id_from_string("Test12344444444444444");

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...