Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
; // fill uuid_data boost::uuids::uuid u; memcpy(&u, uuid_data, 16); } { // example using aggregate initializers boost::uuids::uuid u = { 0x12 ,0x34, 0x56, 0x78 , 0x90, 0xab , 0xcd, 0xef , 0x12, 0x34 , 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef }; } // example of creating a uuid class that // initializes the uuid in the constructor // using a defined mechanism class uuid_class : public boost::uuids::uuid { public: uuid_class() : boost::uuids::uuid(boost::uuids::random_generator()()) {} explicit uuid_class(boost::uuids::uuid const& u) : boost::uuids::uuid(u) {} operator boost::uuids::uuid() { return static_cast<boost::uuids::uuid&>(*this); } operator boost::uuids::uuid() const { return static_cast<boost::uuids::uuid const&>(*this); } }; uuid_class u1; uuid_class u2; assert(u1 != u2); >

Byte Extraction

Иногда полезно получить 16 байтuuidнапрямую. Типичное использование выглядит следующим образом:<

boost::uuids::uuid u;
std::vector<char> v(u.size());
std::copy(u.begin(), u.end(), v.begin());
>

Примечание:повышение::uuids::uuid::size()всегда возвращается 16.

Ссылка

boost/uuid/uuid.hpp

Синопсис

<
namespace boost {
namespace uuids {
class uuid {
public:
    typedef uint8_t value_type;
    typedef uint8_t& reference;
    typedef uint8_t const& const_reference;
    typedef uint8_t* iterator;
    typedef uint8_t const* const_iterator;
    typedef std::size_t size_type;
    typedef std::ptrdiff_t difference_type;
    static constexpr size_type static_size() noexcept;
    // iteration
    iterator begin() noexcept;
    iterator end() noexcept;
    const_iterator begin() const noexcept;
    const_iterator end() const noexcept;
    constexpr size_type size() const noexcept;
    bool is_nil() const noexcept;
    enum variant_type {
        variant_ncs, // NCS backward compatibility
        variant_rfc_4122, // defined in RFC 4122 document
        variant_microsoft, // Microsoft Corporation backward compatibility
        variant_future // future definition
    };
    variant_type variant() const noexcept;
    enum version_type {
        version_unknown = -1,
        version_time_based = 1,
        version_dce_security = 2,
        version_name_based_md5 = 3,
        version_random_number_based = 4,
        version_name_based_sha1 = 5
    };
    version_type version() const noexcept;
    // Swap function
    void swap(uuid& rhs) noexcept;
    uint8_t data[static_size()];
};
// standard operators
bool operator==(uuid const& lhs, uuid const& rhs) noexcept;
bool operator!=(uuid const& lhs, uuid const& rhs) noexcept;
bool operator<(uuid const& lhs, uuid const& rhs) noexcept;
bool operator>(uuid const& lhs, uuid const& rhs) noexcept;
bool operator<=(uuid const& lhs, uuid const& rhs) noexcept;
bool operator>=(uuid const& lhs, uuid const& rhs) noexcept;
void swap(uuid& lhs, uuid& rhs) noexcept;
std::size_t hash_value(uuid const& u) noexcept;
}} // namespace boost::uuids
>

Размер

Размер ууида(в байтах) может быть получен либо вызовом функцииboost::uuids::uuid::size(), либо вызовом статической функцииboost::uuids:::uuid::static_size(), оба всегда возвращают 16.<

    boost::uuids::uuid u;
    assert(16 == u.size());
    assert(16 == boost::uuids::uuid::static_size());
>

Итерация

Предоставляются как итераторы, так и постоянные итераторы.<

    boost::uuids::uuid u;
    for (boost::uuids::uuid::const_iterator it=u.begin(); it!=u.end(); ++it) {
        boost::uuids::uuid::value_type v = *it;
    }
    for (boost::uuids::uuid::iterator it=u.begin(); it!=u.end(); ++it) {
        *it = 0;
    }
>

Ниль ууид

Функцияboost::uuids::uuid:::nil()возвращается истинной тогда и только тогда, когдаuuidравен {00000000-0000-0000-000000000000}.

Variant

Три битаuuidопределяют вариант.

    boost::uuids::uuid u;
    boost::uuids::uuid::variant_type v = u.variant();

Version

Четыре битаuuidопределяют вариант, то есть механизм, используемый для генерацииuuid.

    boost::uuids::uuid u;
    boost::uuids::uuid::version_type v = u.version();

Swap

бустер::uuids::uuid::swap()ибустер::uuids::swap().

    boost::uuids::uuid u1, u2;
    u1.swap(u2);
    swap(u1, u2);

Operators

Все стандартные числовые операторы определены для классаuuid. К ним относятся:<

    operator==
    operator!=
    operator<
    operator>
    operator<=
    operator>=
>

Хэш-функция

Эта функция позволяет использоватьuuids сбустером::hash<

boost::hash<boost::uuids::uuid> uuid_hasher;
std::size_t uuid_hash_value = uuid_hasher(boost::uuids::uuid());
>

boost/uuid/uuid_generators.hpp

Synopsis

Этот файл включает в себя все генераторыuuidдля удобства.<
#include <boost/uuid/nil_generator.hpp>
#include <boost/uuid/string_generator.hpp>
#include <boost/uuid/name_generator.hpp>
#include <boost/uuid/random_generator.hpp>
>

boost/uuid/nil_generator.hpp

Synopsis

<
namespace boost {
namespace uuids {
struct nil_generator {
    typedef uuid result_type;
    
    uuid operator()() const;
};
uuid nil_uuid();
}} //namespace boost::uuids
>

Классboost::uuids::nil_generatorвсегда генерирует niluuid.<

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

boost/uuid/string_generator.hpp

Повышениеboost::uuids::string_generatorкласс генерируетuuidиз строки.<

boost::uuids::string_generator gen;
boost::uuids::uuid u1 = gen("{01234567-89ab-cdef-0123-456789abcdef}");
boost::uuids::uuid u2 = gen(L"01234567-89ab-cdef-0123-456789abcdef");
boost::uuids::uuid u3 = gen(std::string("0123456789abcdef0123456789abcdef"));
boost::uuids::uuid u4 = gen(std::wstring(L"01234567-89ab-cdef-0123-456789abcdef"));
>

boost/uuid/name_generator.hpp

Synopsis

<
namespace boost {
namespace uuids {
class name_generator {
public:
    typedef uuid result_type;
    
    explicit name_generator(uuid const& namespace_uuid);
    uuid operator()(const char* name) const;
    uuid operator()(const wchar_t* name) const;
    tempate <typename ch, typename char_traits, typename alloc>
        uuid operator()(std::basic_string<ch, char_traits, alloc> const& name) const;
    uuid operator()(void const* buffer, std::size_t byte_count) const;
};
}} //namespace boost::uuids
>

Name Generator

boost::uuids::name_generatorclass генерирует имя на основеuuidиз пространства имен uuid и имени.<

boost::uuids::uuid dns_namespace_uuid; // initialize to {6ba7b810-9dad-11d1-80b4-00c04fd430c8}
boost::uuids::name_generator gen(dns_namespace_uuid);
boost::uuids::uuid u = gen("boost.org");
>

boost/uuid/random_generator.hpp

Synopsis

<
namespace boost {
namespace uuids {
template <typename UniformRandomNumberGenerator>
class basic_random_generator {
public:
    typedef uuid result_type;
    
    basic_random_generator();
    explicit basic_random_generator(UniformRandomNumberGenerator& gen);
    explicit basic_random_generator(UniformRandomNumberGenerator* pGen);
    
    uuid operator()();
};
typedef basic_random_generator<mt19937> random_generator;
}} // namespace boost::uuids
>

Случайный генератор

Повышение::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

Synopsis

<
namespace boost {
namespace uuids {
template <typename ch, typename char_traits>
    std::basic_ostream<ch, char_traits>& operator<<(std::basic_ostream<ch, char_traits> &os, uuid const& u);
template <typename ch, typename char_traits>
    std::basic_istream<ch, char_traits>& operator>>(std::basic_istream<ch, char_traits> &is, uuid &u);
    
std::string to_string(uuid const& u);
std::wstring to_wstring(uuid const& u);
}} // namespace boost::uuids
>

Stream Operators

Стандартные операторы потоков ввода и вывода<<и>>обеспечиваются за счет включения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);
>

Можно также использоватьboost::lexical_cast.<

boost::uuids::uuid u1; // initialize uuid
std::string s = boost::lexical_cast<std::string>(u);
boost::uuids::uuid u2 = boost::lexical_cast<boost::uuids::uuid>(s);
assert(u1 == u2);
>

To String

Функцииto_stringиto_wstringпредоставляются в качестве удобства для преобразованияuuidв строку. Они также, вероятно, быстрее, чем операторы потоков или используют ускорение::lexical_cast.<

boost::uuids::uuid u; // initialize uuid
std::string s1 = to_string(u);
std::wstring s2 = to_wstring(u);
>

boost/uuid/uuid_serialize.hpp

Synopsis

<
namespace boost {
namespace uuids {
BOOST_CLASS_IMPLEMENTATION(boost::uuids::uuid, boost::serialization::primitive_type)
}} // namespace boost::uuids
>

Сериализация

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

Включитьboost/uuid/uuid_serialize.hpp, чтобы включить сериализацию дляuuids.

Примечания к дизайну

Документ,http://www.itu.int/ITU-T/studygroups/com17/oid/X.667-E.pdf, использовался для проектирования и реализацииповышения::uuids:::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.

Все функции возвращаются. Классы так же безопасны, как и инт. То есть экземпляр не может быть разделен между потоками без надлежащей синхронизации.

История и признания

Ряд людей в списке рассылкиboost.orgпредоставили полезные комментарии и значительно помогли сформировать библиотеку.

Revised  6 февраля 2010


Авторское право Энди Томпкинс, 2006

Распространяется под лицензией Boost Software License, версия 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию наwww.boost.org/LICENSE_1_0.txt)

Статья Uuid Library раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


Uuid Library

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Uuid

Contents

  1. Введение
  2. Конфигурация
  3. Примеры
  4. Ссылка
  5. Примечания к проекту
  6. История и признания

Introduction

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*могут быть определены пользователями, если автоматическое обнаружение не удается и известно, что целевой процессор будет иметь расширение. Не включайте эти расширения, если вы не уверены, что они всегда будут доступны на любой машине, которая запустит вашу программу. Библиотека не выполняет проверки времени выполнения, поэтому, если расширение отсутствует, программа, скорее всего, рухнет. Обратите внимание, что предоставление более продвинутых расширений означает, что доступны и более базовые.

Примеры

Тегирование

<
// example of tagging an object with a uuid
// seeboost/libs/uuid/test/test_tagging.cpp
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
class object
{
public:
    object()
        : tag(boost::uuids::random_generator()())
        , state(0)
    {}
    explicit object(int state)
        : tag(boost::uuids::random_generator()())
        , state(state)
    {}
    object(object const& rhs)
        : tag(rhs.tag)
        , state(rhs.state)
    {}
    bool operator==(object const& rhs) const {
        return tag == rhs.tag;
    }
    object& operator=(object const& rhs) {
        tag = rhs.tag;
        state = rhs.state;
    }
    int get_state() const { return state; }
    void set_state(int new_state) { state = new_state; }
private:
    boost::uuids::uuid tag;
    int state;
};
object o1(1);
object o2 = o1;
o2.set_state(2);
assert(o1 == o2);
object o3(3);
assert(o1 != o3);
assert(o2 != o3);
>

Эффективность ПОД

Эта библиотека реализует 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<

// example using memcpy and aggregate initializers
// example of a class uuid seeboost/libs/uuid/test/test_uuid_class.cpp
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
{ // example using memcpy
    unsigned char uuid_data

реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 09:02:08/0.0068249702453613/1