#c #reinterpret-cast
#c #переинтерпретировать приведение
Вопрос:
Недавно я использую код для создания уникального 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
действительно уникально для всех строк ввода?
Ответ №1:
Нет, это не так. Вы приводите адрес строки, а не ее содержимое.
Чтобы создать числовое значение на основе ввода строки, используйте хэш-функцию. Однако это не создает действительно уникальный номер из-за так называемого принципа pigeonhole .
Ответ №2:
Это будет зависеть. Вот моя интерпретация вашего вопроса:
Вы пытаетесь присвоить разные номера каждой строке. И одинаковые строки из разных источников будут иметь разные идентификаторы.
Случай 1:
Если str
это повторно используемый буфер, который вы используете для чтения в этих строках откуда угодно. Тогда все они будут иметь один и тот же базовый адрес. Так что нет, оно не будет уникальным.
Случай 2:
str
оказывается выделенной из кучи строкой. Кроме того, все строки, которые будут идентифицироваться, имеют перекрывающиеся периоды жизни. Тогда да, идентификаторы будут уникальными, потому что все они находятся в памяти одновременно по разным адресам.
Редактировать:
Если вы хотите сгенерировать уникальный идентификатор, но хотите, чтобы идентичные строки имели одинаковый идентификатор, тогда посмотрите на ответ Грега для хэш-функции.
Ответ №3:
Оно может быть не всегда уникальным,
id1 = generate_unique_id_from_string("test12344444444444444");
id2 = generate_unique_id_from_string("Test12344444444444444");
Кроме того, я думаю, что это будет зависеть от порядкового номера платформы.