C переинтерпретирует приведение, создавая уникальный номер

#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");
  

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