UUID, или Универсальный уникальный идентификатор, предназначен для уникальной идентификации информации в распределенной среде без значительной центральной координации. Он может использоваться для обозначения объектов с очень коротким сроком службы или для надежной идентификации очень устойчивых объектов по сети.
Устройства имеют множество применений. Ниже приводятся некоторые примеры: Базы данных могут использовать UUID для идентификации строк или записей, чтобы гарантировать, что они уникальны для различных баз данных или для услуг публикации / подписки. Сетевые сообщения могут быть идентифицированы с UUID, чтобы гарантировать, что различные части сообщения снова собраны вместе. Распределенные вычисления могут использовать UUID для идентификации вызова удаленной процедуры. Транзакции и классы, участвующие в сериализации, могут быть идентифицированы UUID. Модель объекта компонента Microsoft (COM) использует UUID для различения различных интерфейсов компонентов программного обеспечения. UUID вставляются в документы из программ Microsoft Office. UUID идентифицируют аудио или видео потоки в Advanced Systems Format (ASF). UUID также являются основой для OID (идентификаторов объектов) и URN (однородное имя ресурса).
Привлекательной особенностью UUID по сравнению с альтернативами является их относительный небольшой размер, 128 бит или 16 байт. Другое дело, что создание UUID не требует централизованной власти.
Когда UUID генерируются одним из определенных механизмов, они либо гарантированно являются уникальными, отличными от всех других генерируемых UUID (то есть они никогда не генерировались ранее и никогда не будут генерироваться снова), либо они чрезвычайно вероятно будут уникальными (в зависимости от механизма).
Библиотека не требует строительства или какой-либо специальной конфигурации. Тем не менее, есть несколько вариантов, которые могут быть включены путем определения макросов до включения заголовков библиотеки. Эти макросы суммируются в следующей таблице.
Макро
Описание
BOOST_UUID_NO_SIMD
Если определено, отключается любая оптимизация дляSIMDпроцессоров с поддержкой. Вместо этого будут использоваться общие версии алгоритмов. Это может привести к неоптимальной производительности. По умолчанию используются оптимизированные алгоритмы, когда библиотека способна обнаружить наличие расширений SIMD во время компиляции.
BOOST_UUID_USE_SSE2
Если он определен, он позволяет оптимизировать расширенияSSE2, доступные в современных процессорах x86.
BOOST_UUID_USE_SSE3
Если это определено, это позволяет оптимизировать расширенияSSE3, доступные в современных процессорах x86.
BOOST_UUID_USE_SSE41
Если это определено, это позволяет оптимизировать расширенияSSE4.1, доступные в современных процессорах x86.
По умолчанию библиотека пытается обнаружить наличие расширений SIMD в целевом процессоре во время компиляции и автоматически определяет соответствующие макросы, если это удается. МакросыBOOST_UUID_USE_SSE*могут быть определены пользователями, если автоматическое обнаружение не удается и известно, что целевой процессор будет иметь расширение. Не включайте эти расширения, если вы не уверены, что они всегда будут доступны на любой машине, которая запустит вашу программу. Библиотека не выполняет проверки времени выполнения, поэтому, если расширение отсутствует, программа, скорее всего, рухнет. Обратите внимание, что предоставление более продвинутых расширений означает, что доступны и более базовые.
Эта библиотека реализует UUID в качестве POD, позволяя использовать UUID наиболее эффективными способами, включая использование memcpy и агрегированных инициализаторов. Недостатком является то, что POD не может иметь никаких конструкторов, и, таким образом, объявление UUID не будет инициализировать его до значения, генерируемого одним из определенных механизмов. Но можно определить класс, основанный на UUID, который инициализирует себя к значению, генерируемому одним из определенных механизмов.
Обратите внимание, чтоboost::is_podспециализируется наboost::uuid:::uuidи зависит отBoost.TypeTraitsОпределитьBOOST_UUID_NO_TYPE_TRAITSперед включениемboost/uuid/uuid.hppдля удаления зависимости отBoost.TypeTraits<
Размер ууида(в байтах) может быть получен либо вызовом функцииboost::uuids::uuid::size(), либо вызовом статической функцииboost::uuids:::uuid::static_size(), оба всегда возвращают 16.<
boost::uuids::nil_generator gen;
boost::uuids::uuid u = gen();
assert(u.is_nil() == true);
// or for convenience
boost::uuids::uuid u = boost::uuids::nil_uuid();
assert(u.is_nil() == true);
Повышение::uuids::basic_random_generatorкласс генерирует случайное число на основе uuid от генератора случайных чисел (тот, который соответствуетUniformRandomNumberGeneratorConcept.<
//default construct the random number generator and seed it
boost::uuids::basic_random_generator<boost::mt19937> gen;
boost::uuids::uuid u = gen();
//for convenience boost::uuids::random_generator
//is equivalent to boost::uuids::basic_random_generator<boost::mt19937>
boost::uuids::random_generator gen;
boost::uuids::uuid u = gen();
//use an existing random number generator
//pass either a reference or a pointer to the random number generator
boost::mt19937 ran;
boost::uuids::basic_random_generator<boost::mt19937> gen(&ran);
boost::uuids::uuid u = gen();
Стандартные операторы потоков ввода и вывода<<и>>обеспечиваются за счет включенияboost/uuid/uuid_io.hpp.uuidявляется струнным представлениемuuid. hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh, гдеhявляется шестнадцатеричным числом.<
boost::uuids::uuid u1; // initialize uuid
std::stringstream ss;
ss << u1;
boost::uuids::uuid u2;
ss >> u2;
assert(u1, u2);
Функцииto_stringиto_wstringпредоставляются в качестве удобства для преобразованияuuidв строку. Они также, вероятно, быстрее, чем операторы потоков или используют ускорение::lexical_cast.<
Сериализация осуществляется библиотекойПовысить Сериализацию.uuidсериализуется какпримитивный тип, таким образом, только значениеuuidбудет сохранено / загружено из архива.
Повышение::uuids::basic_random_generatorпо умолчанию конструктор класса сеет генератор случайных чисел с хэшем SHA-1 ряда различных значений, включаяstd::time(0),std::clock(), неинициализированные данные, возврат значения отнового неподписанного intи т. д.
ИспользованиеValgrindпроизводит ряд ложных срабатываний с по умолчанию конструкторомboost::uuids::basic_random_generator. Одним из решений является устранение ошибок, описанных вдокументации Валгринда. Другое решение — использовать другой конструкторboost::uuids::basic_random_generatorи явно передавать в генераторе случайных чисел.<
boost::mt19937 ran;
ran.seed(time(NULL)); // one should likely seed in a better way
boost::uuids::basic_random_generator<boost::mt19937> gen(&ran);
boost::uuids::uuid u = gen();
>
Повышение::uuids::name_generatorкласс использует хеш-функцию SHA-1 для вычисленияuuid.
Все функции возвращаются. Классы так же безопасны, как и инт. То есть экземпляр не может быть разделен между потоками без надлежащей синхронизации.
Статья Uuid Library раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.