Implementasi perpustakaan cross-platform cross-platform single-header untuk pengidentifikasi unik secara universal , cukup dikenal sebagai UUID atau GUID (kebanyakan di Windows). UUID adalah angka 128-bit yang digunakan untuk mengidentifikasi secara unik informasi dalam sistem komputer, seperti tombol tabel basis data, antarmuka COM, kelas dan jenis pustaka, dan banyak lainnya.
Untuk informasi tentang UUID/GUIDS lihat:
Meskipun spesifikasi menempatkan perpustakaan UUID di namespace std , implementasi ini menggunakan namespace uuids untuk tujuan ini, untuk membuat perpustakaan dapat digunakan tanpa melanggar pembatasan yang dikenakan pada namespace std . Jenis dan utilitas berikut tersedia:
Tipe Dasar:
| Nama | Keterangan |
|---|---|
uuid | Kelas yang mewakili UUID; Ini dapat dibangun secara default (nil uuid), dibangun dari kisaran (ditentukan oleh sepasang iterator), atau dari span . |
uuid_variant | jenis enum yang sangat mewakili jenis uuid |
uuid_version | tipe enum yang kuat mewakili versi uuid |
Generator:
| Nama | Keterangan |
|---|---|
basic_uuid_random_generator | Objek fungsi yang menghasilkan versi 4 uuid menggunakan mesin generator bilangan pseudo-acak. |
uuid_random_generator | A basic_uuid_random_generator Menggunakan mesin Mersenne Twister ( basic_uuid_random_generator<std::mt19937> ) |
uuid_name_generator | Objek fungsi yang menghasilkan versi 5, UUID berbasis nama menggunakan hashing SHA1. |
uuid_system_generator | Objek fungsi yang menghasilkan UUID baru menggunakan sumber daya sistem operasi ( CoCreateGuid pada windows, uuid_generate di linux, CFUUIDCreate pada mac)Catatan : Ini bukan bagian dari proposal standar. Ini hanya tersedia jika makro UUID_SYSTEM_GENERATOR didefinisikan. |
uuid_time_generator | Objek fungsi eksperimental yang menghasilkan UUID berbasis waktu. Catatan : Ini adalah fitur eksperimental dan tidak boleh digunakan dalam kode produksi apa pun. Ini hanya tersedia jika makro UUID_TIME_GENERATOR didefinisikan. |
Utilitas:
| Nama | Keterangan |
|---|---|
std::swap<> | spesialisasi swap untuk uuid |
std::hash<> | Spesialisasi hash untuk uuid (diperlukan untuk menyimpan UUID dalam wadah asosiatif yang tidak teratur, seperti std::unordered_set ) |
Konstanta:
| Nama | Keterangan |
|---|---|
uuid_namespace_dns | ID namespace untuk UUID berbasis nama saat string nama adalah nama domain yang sepenuhnya memenuhi syarat. |
uuid_namespace_url | ID namespace untuk UUID berbasis nama saat string nama adalah URL. |
uuid_namespace_oid | ID Namespace untuk UUIDS berbasis nama ketika Mame String adalah ISO OID (lihat https://oidref.com/, https://en.wikipedia.org/wiki/object_identifier). |
uuid_namespace_x500 | ID Namespace untuk UUID berbasis nama ketika string nama adalah x.500 dn, dalam der atau format output teks (lihat https://en.wikipedia.org/wiki/x.500, https://en.wikipedia.org/wiki/abstract_notax_notation_one. |
Lainnya:
| Nama | Keterangan |
|---|---|
operator== dan operator!= | untuk perbandingan uuids untuk kesetaraan/ketidaksetaraan |
operator< | Untuk membandingkan apakah satu uuid kurang dari yang lain. Meskipun operasi ini tidak masuk akal secara logis, perlu untuk menyimpan uuid di std :: set. |
operator<< | Untuk menulis UUID ke aliran output menggunakan representasi tekstual kanonik. |
to_string() | Membuat string dengan representasi tekstual kanonik dari UUID. |
Perpustakaan ini adalah implementasi proposal P0959.
Ketika proposal berkembang berdasarkan komite standar dan umpan balik komunitas C ++, implementasi perpustakaan ini akan mencerminkan perubahan tersebut.
Lihat Revisi Sejarah Proposal untuk Sejarah Perubahan.
Berikut ini adalah daftar contoh untuk menggunakan perpustakaan:
Membuat nil uuid
uuid empty;
assert (empty.is_nil());Membuat UUID baru
uuid const id = uuids::uuid_system_generator{}();
assert (!id.is_nil());
assert (id.version() == uuids::uuid_version::random_number_based);
assert (id.variant() == uuids::uuid_variant::rfc);Membuat UUID baru dengan generator acak default
std::random_device rd;
auto seed_data = std::array< int , std::mt19937::state_size> {};
std::generate (std::begin(seed_data), std::end(seed_data), std::ref(rd));
std::seed_seq seq (std::begin(seed_data), std::end(seed_data));
std::mt19937 generator (seq);
uuids::uuid_random_generator gen{generator};
uuid const id = gen();
assert (!id.is_nil());
assert (id.as_bytes().size() == 16);
assert (id.version() == uuids::uuid_version::random_number_based);
assert (id.variant() == uuids::uuid_variant::rfc);Membuat UUID baru dengan generator acak tertentu
std::random_device rd;
auto seed_data = std::array< int , 6 > {};
std::generate (std::begin(seed_data), std::end(seed_data), std::ref(rd));
std::seed_seq seq (std::begin(seed_data), std::end(seed_data));
std::ranlux48_base generator (seq);
uuids::basic_uuid_random_generator<std::ranlux48_base> gen (&generator);
uuid const id = gen();
assert (!id.is_nil());
assert (id.as_bytes().size() == 16);
assert (id.version() == uuids::uuid_version::random_number_based);
assert (id.variant() == uuids::uuid_variant::rfc);Membuat uuid baru dengan generator nama
uuids::uuid_name_generator gen (uuids::uuid::from_string( " 47183823-2574-4bfd-b411-99ed177d3e43 " ).value());
uuid const id = gen( " john " );
assert (!id.is_nil());
assert (id.version() == uuids::uuid_version::name_based_sha1);
assert (id.variant() == uuids::uuid_variant::rfc);Buat uuid dari string
auto str = " 47183823-2574-4bfd-b411-99ed177d3e43 " s;
auto id = uuids::uuid::from_string(str);
assert (id.has_value());
assert (uuids::to_string(id.value()) == str);
// or
auto str = L" 47183823-2574-4bfd-b411-99ed177d3e43 " s;
uuid id = uuids::uuid::from_string(str).value();
assert (uuids::to_string< wchar_t >(id) == str);Membuat uuid dari urutan 16 byte
std::array<uuids::uuid::value_type, 16 > arr{{
0x47 , 0x18 , 0x38 , 0x23 ,
0x25 , 0x74 ,
0x4b , 0xfd ,
0xb4 , 0x11 ,
0x99 , 0xed , 0x17 , 0x7d , 0x3e , 0x43 }};
uuid id (arr);
assert (uuids::to_string(id) == "47183823-2574-4bfd-b411-99ed177d3e43");
// or
uuids::uuid::value_type arr[ 16 ] = {
0x47 , 0x18 , 0x38 , 0x23 ,
0x25 , 0x74 ,
0x4b , 0xfd ,
0xb4 , 0x11 ,
0x99 , 0xed , 0x17 , 0x7d , 0x3e , 0x43 };
uuid id (std::begin(arr), std::end(arr));
assert (uuids::to_string(id) == "47183823-2574-4bfd-b411-99ed177d3e43");
// or
uuids::uuid id{{
0x47 , 0x18 , 0x38 , 0x23 ,
0x25 , 0x74 ,
0x4b , 0xfd ,
0xb4 , 0x11 ,
0x99 , 0xed , 0x17 , 0x7d , 0x3e , 0x43 }};
assert (uuids::to_string(id) == "47183823-2574-4bfd-b411-99ed177d3e43");Membandingkan uuids
uuid empty;
uuid id = uuids::uuid_system_generator{}();
assert (empty == empty);
assert (id == id);
assert (empty != id);Menukar uuids
uuid empty;
uuid id = uuids::uuid_system_generator{}();
assert (empty.is_nil());
assert (!id.is_nil());
std::swap (empty, id);
assert (!empty.is_nil());
assert (id.is_nil());
empty.swap(id);
assert (empty.is_nil());
assert (!id.is_nil());Mengonversi ke string
uuid empty;
assert (uuids::to_string(empty) == "00000000-0000-0000-0000-000000000000");
assert (uuids::to_string< wchar_t >(empty) == L"00000000-0000-0000-0000-000000000000");Menggunakan dengan wadah asosiatif yang dipesan
std::random_device rd;
auto seed_data = std::array< int , std::mt19937::state_size> {};
std::generate (std::begin(seed_data), std::end(seed_data), std::ref(rd));
std::seed_seq seq (std::begin(seed_data), std::end(seed_data));
std::mt19937 engine (seq);
uuids::uuid_random_generator gen (&engine);
std::set<uuids::uuid> ids{uuid{}, gen (), gen (), gen (), gen ()};
assert (ids.size() == 5);
assert (ids.find(uuid{}) != ids.end());Menggunakan dalam wadah asosiatif yang tidak teratur
std::random_device rd;
auto seed_data = std::array< int , std::mt19937::state_size> {};
std::generate (std::begin(seed_data), std::end(seed_data), std::ref(rd));
std::seed_seq seq (std::begin(seed_data), std::end(seed_data));
std::mt19937 engine (seq);
uuids::uuid_random_generator gen (&engine);
std::unordered_set<uuids::uuid> ids{uuid{}, gen (), gen (), gen (), gen ()};
assert (ids.size() == 5);
assert (ids.find(uuid{}) != ids.end());Hashing uuids
using namespace std ::string_literals ;
auto str = " 47183823-2574-4bfd-b411-99ed177d3e43 " s;
uuid id = uuids::uuid::from_string(str).value();
auto h1 = std::hash<std::string>{};
auto h2 = std::hash<uuid>{};
assert (h1(str) == h2(id)); Jika Anda menghasilkan uuid menggunakan basic_uuid_random_generator dan std :: acak_device untuk menyemai generator, perlu diingat bahwa ini mungkin bukan non-deterministik dan benar-benar menghasilkan urutan angka yang sama:
STD :: Random_Device dapat diimplementasikan dalam hal mesin bilangan pseudo-acak yang ditentukan implementasi jika sumber non-deterministik (misalnya perangkat perangkat keras) tidak tersedia untuk implementasi. Dalam hal ini setiap objek std :: random_device dapat menghasilkan urutan angka yang sama.
Ini bisa menjadi masalah dengan Mingw. Lihat Bug 85494 - Implementasi Random_Device di Mingw tidak berguna. Ini diperbaiki di GCC 9.2.
Alternatif portabel adalah dengan menggunakan pustaka Boost.Random.
Perpustakaan didukung pada semua sistem operasi utama: Windows, Linux dan Mac OS.
Jika Anda menggunakan perpustakaan dalam proyek yang dibangun dengan C ++ 20, maka Anda dapat menggunakan std::span . Ini digunakan secara default, jika header didukung oleh kompiler Anda. Cek dilakukan dengan makro tes fitur __cpp_lib_span.
Kalau tidak, seperti saat membangun dengan C ++ 17, std::span tidak tersedia. Namun, Microsoft Guidelines Support Library (alias GSL) dapat digunakan untuk implementasi span (dari mana versi standar didefinisikan). Default Perpustakaan Stduuid untuk menggunakan implementasi ini jika std::span tidak tersedia.
Untuk memastikan gsl::span dapat digunakan, pastikan perpustakaan GSL tersedia, dan GSL termasuk direktori tercantum dalam direktori termasuk untuk proyek.
Jika Anda menggunakan cmake untuk membangun proyek uji, pastikan variabel yang disebut UUID_USING_CXX20_SPAN tidak ditentukan, atau nilainya OFF (ini adalah nilai default). Ini akan memastikan direktori gsl akan dimasukkan dalam daftar pencarian direktori header.
Proyek pengujian tersedia di sumber. Untuk membangun dan melaksanakan tes, lakukan hal berikut:
build di direktori root sumbercmake .. dari direktori build ; Jika Anda tidak memiliki CMake, Anda harus menginstalnya terlebih dahulu.Contoh
Untuk menghasilkan file proyek untuk Visual Studio 2019, Anda dapat menjalankan perintah berikut:
cd build
cmake -G "Visual Studio 17" -A x64 ..
Untuk mengaktifkan sistem operasi uuid generator atur variabel UUID_SYSTEM_GENERATOR ke ON .
cd build
cmake -G "Visual Studio 17" -A x64 -DUUID_SYSTEM_GENERATOR=ON ..
Untuk mengaktifkan generator uuid berbasis waktu eksperimental, atur variabel UUID_TIME_GENERATOR ke ON .
cd build
cmake -G "Visual Studio 17" -A x64 -DUUID_TIME_GENERATOR=ON ..
Implementasi SHA1 didasarkan pada perpustakaan Tinysha1.