Часто это полезно для целей регистрации в приложениях в реальном времени, таких как игры, чтобы дать каждому сущности имя. Это облегчает отслеживание ошибок, потому что поиск сущностей с помощью уникальных имен проще, чем смотреть на уникальные числа или другие формы идентификаторов. Но струны огромны, и копирование и сравнение их, нельзя, поэтому их часто нельзя использовать в критическом коде.
Одним из решений являются хэшируемые строки, которые являются только целыми числами и, следовательно, небольшие, быстрые для копирования и сравнения. Но хэши не позволяют получать исходное значение строкового значения, которое именно необходимо для целей ведения регистрации и отладки! Кроме того, существует вероятность столкновений, поэтому равный хэш -код не обязательно означает равные строки. Этот шанс маленький, но источник для трудностей найти ошибки.
Другим решением является интернинг строк. String Ronging использует глобальную таблицу поиска, где каждая строка хранится только один раз и ссылается через индекс или что-то подобное. Копирование и сравнение тоже быстро, но они все еще не идеальны: вы можете получить доступ к ним только во время выполнения. Получение значения во время компиляции, например, для переключателя невозможно.
Итак, с одной стороны, мы хотим быстрых и легких идентификаторов, но, с другой стороны, также методы возвращения имени обратно.
Эта библиотека с открытым исходным кодом предоставляет смесь между двумя решениями в форме класса string_id . Каждый объект хранит хешированное строковое значение и указатель на базу данных, в которой хранится исходное строковое значение. Это позволяет получить значение строки при необходимости, а также получить преимущества производительности от хэшированных строк. Кроме того, база данных может обнаружить столкновения, которые можно обрабатывать с помощью пользовательского обработчика столкновений. Существует пользовательский литерал для создания значения хешированной строки с компиляцией, чтобы использовать его в качестве постоянного выражения.
База данных может быть любой пользовательский тип, полученный из определенного класса интерфейса. Есть несколько заранее определенных баз данных. Это включает в себя фиктивную базу данных, которая ничего не хранит, адаптер для других баз данных, чтобы сделать их Threadsafe и высоко оптимизированную базу данных для эффективного хранения и извлечения строк. Typedef default_database является одной из этих баз данных и может быть установлена с помощью следующих параметров Cmake:
FOONATHAN_STRING_ID_DATABASE - Если выключено , база данных полностью отключена, например, используется фиктивная база данных. Это не позволяет извлечь строки или проверку столкновений, но не нуждается в такой много памяти. Он включен по умолчанию.
FOONATHAN_STRING_ID_MULTITHREADED - Если включено , доступ к базе данных будет синхронизирован через мутекс, например, будет использоваться безопасный адаптер потока. Это не влияет, если база данных отключена. Значение по умолчанию включено .
Есть специальные классы генератора. Они имеют аналогичный интерфейс с генераторами случайных чисел в стандартных библиотеках, но генерируют идентификаторы строк. Это используется для создания кучу идентификаторов автоматическим образом. Генераторы также позаботятся о том, что всегда созданы новые идентификаторы. Это можно контролировать через обработчик, похожий на обработку столкновений.
См. Пример/main.cpp для примера.
В настоящее время он использует 64-битный хэш FNV-1A. Столкновения действительно редки, я протестировал 219 606 английских слов (в нижнем регистре), смешанных с кучей чисел, и не столкнулся с ни одного столкновения. Поскольку это обычный случай использования идентификаторов, функция хэш довольно хороша. Кроме того, существует хорошее распределение значений хеширования, и их легко рассчитать.
База данных использует специализированную хэш -таблицу. Столкновения индекса ведра разрешаются через отдельную цепочку с одним связанным списком. Каждый узел содержит строку непосредственно без дополнительного распределения памяти. Узлы в связанном списке отсортируются с использованием значения хэша. Это позволяет эффективно извлекать и проверять, есть ли уже строка с тем же хэш -значением. Это делает его очень эффективным и быстрее, чем std :: Unoromeded_map, который использовался ранее (по крайней мере, быстрее, чем реализация Libstdc ++, которую я использовал для контрольных показателей).
Эта библиотека была составлена под следующими компиляторами:
Существуют параметры совместимости и замена Marcos для ContexPR, noExcte, переопределения и литеральных операторов. Функции атомного обработчика могут быть отключены необязательно и по умолчанию отключены для GCC 4.6, поскольку они не поддерживают их.