Как получить строку имени класса фиксированного размера

Я использую typeid(ClassName).name(), чтобы получить имя для широкого диапазона типов классов. Однако мне нужно сделать его длину фиксированной (например, 8 символов). Во многих случаях класс находится в пространстве имен, что делает строку такой длинной, и она не работает, если я просто получаю первые 10 символов.

Кто-нибудь знает хороший способ кодировать/декодировать строку в строку фиксированного размера? Я не могу вести таблицу для сопоставления hash_code с именем, так как я собираюсь отправить строку на другую машину, у которой нет доступа к карте.

 template <typename ClassType> char* get_name(){
      return typeid(ClassType).name(); // ?? 
 }

person Narges Shahidi    schedule 23.09.2016    source источник
comment
Похоже, вам нужно найти алгоритм сжатия. Не знаю, возможно ли это.   -  person alain    schedule 23.09.2016
comment
Это очень похоже на проблему XY.   -  person molbdnilo    schedule 23.09.2016
comment
@molbdnilo, если вы знаете какой-либо другой подход, кроме использования typeid, я буду рад узнать.   -  person Narges Shahidi    schedule 23.09.2016
comment
Почему имя должно быть фиксированной длины? Какую настоящую проблему вы пытаетесь здесь решить?   -  person ChrisF    schedule 23.09.2016
comment
Я собираюсь отправить строку на другую машину, у которой нет доступа к карте. Так почему бы не прислать и карту (в сериализованном виде)?   -  person Ami Tavory    schedule 23.09.2016
comment
Я хочу знать, какие типы классов используются для вызова этой функции. Мне приходится хранить информацию в очень маленькой памяти, но я не могу контролировать имена классов. Поэтому я хочу сохранить строки ограниченного размера (8B)   -  person Narges Shahidi    schedule 23.09.2016
comment
@AmiTavory Я просто не могу этого сделать.   -  person Narges Shahidi    schedule 23.09.2016
comment
Ну, вы могли бы просто отправить последние X символов...   -  person Christian Hackl    schedule 23.09.2016


Ответы (1)


В общем случае невозможно построить функцию, отображающую строки произвольной длины в фиксированный домен. Это нарушает принцип сортировки.

Следующее предложение кажется мне довольно запутанным, но, учитывая отсутствие более широкого контекста вашей проблемы, здесь идет...

Предположим, вы создаете класс, через который прогоняете все ваши имена, т.е.

class compressor {
    explicit compressor(std::size_t seed);
    std::string operator()(const std::string &name) const;
}

Он состоит из двух элементов: ctor, принимающий начальное значение, и operator(), принимающий строку имени и возвращающий строку ключа из 8 символов. В своем коде инициализируйте этот объект некоторым фиксированным произвольным начальным числом.

Внутри объект класса должен содержать сопоставление unordered_map для каждого отдельного имени, к которому оно было применено, и ключ, с которым оно было сопоставлено. Изначально, очевидно, этот внутренний unordered_map будет пуст.

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

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

На самом деле, поскольку каждое отдельное имя соответствует месту в вашем коде, где вы вызываете typeid, количество различных имен, скажем, n, должно быть не более 1000. Установите m как возможный диапазон с 8 символами (264).

Вероятность столкновения составляет ~n2 / (2 м), что должно быть крошечным. Таким образом, велика вероятность того, что коллизий и исключений не будет. Однако, если он выброшен, измените начальное значение и снова соберите программу. Ожидаемое количество раз, которое вам придется это сделать (после начального раза), близко к 0.

person Ami Tavory    schedule 23.09.2016