UUID 또는 GUID (주로 Windows에서)를 알고 있는 C ++ 17 Cross-Platform Single-Header Library 구현. UUID는 데이터베이스 테이블 키, COM 인터페이스, 클래스 및 유형 라이브러리 등과 같은 컴퓨터 시스템의 정보를 고유하게 식별하는 데 사용되는 128 비트 번호입니다.
UUID/Guid에 대한 정보는 다음을 참조하십시오.
사양은 UUID 라이브러리를 std 네임 스페이스에 넣지만이 구현은 std 네임 스페이스에 부과 된 제한을 위반하지 않고 라이브러리를 사용할 수 있도록이 목적으로 네임 스페이스 uuids 사용합니다. 다음 유형과 유틸리티를 사용할 수 있습니다.
기본 유형 :
| 이름 | 설명 |
|---|---|
uuid | UUID를 나타내는 클래스; 범위 (한 쌍의 반복자로 정의 됨) 또는 span 으로 구성된 기본 구성 (Nil UUID) 일 수 있습니다. |
uuid_variant | UUID의 유형을 나타내는 강력한 유형 열거 |
uuid_version | UUID 버전을 나타내는 강력한 유형 열거 |
발전기 :
| 이름 | 설명 |
|---|---|
basic_uuid_random_generator | 의사 랜덤 번호 발전기 엔진을 사용하여 버전 4 UUID를 생성하는 기능 객체. |
uuid_random_generator | Mersenne Twister 엔진을 사용한 basic_uuid_random_generator ( basic_uuid_random_generator<std::mt19937> ) |
uuid_name_generator | SHA1 해싱을 사용하여 버전 5, 이름 기반 UUID를 생성하는 기능 객체. |
uuid_system_generator | 운영 체제 리소스를 사용하여 새로운 UUID를 생성하는 기능 객체 (Windows의 CoCreateGuid , Linux의 uuid_generate , MAC에서 CFUUIDCreate )참고 : 이것은 표준 제안의 일부가 아닙니다. UUID_SYSTEM_GENERATOR 매크로가 정의 된 경우에만 사용할 수 있습니다. |
uuid_time_generator | 시간 기반 UUID를 생성하는 실험적인 기능 객체. 참고 : 이것은 실험 기능이며 생산 코드에는 사용해서는 안됩니다. UUID_TIME_GENERATOR 매크로가 정의 된 경우에만 사용할 수 있습니다. |
유용:
| 이름 | 설명 |
|---|---|
std::swap<> | uuid 를위한 swap 전문화 |
std::hash<> | uuid 를위한 hash 전문화 ( std::unordered_set 과 같은 비정규 연관 컨테이너에 UUID를 저장하는 데 필요) |
상수 :
| 이름 | 설명 |
|---|---|
uuid_namespace_dns | 이름 기반 UUID의 네임 스페이스 ID 이름 문자열이 완전히 자격이있는 도메인 이름 일 때. |
uuid_namespace_url | 이름 기반 UUID의 네임 스페이스 ID 이름 문자열이 URL 일 때. |
uuid_namespace_oid | MAME String이 ISO OID 인 경우 이름 기반 UUID의 네임 스페이스 ID (https://oidref.com/, https://en.wikipedia.org/wiki/object_identifier 참조). |
uuid_namespace_x500 | 이름 문자열이 x.500 dn, der 또는 텍스트 출력 형식 인 경우 이름 기반 UUID의 네임 스페이스 ID (https://en.wikipedia.org/wiki/x.500, https://en.wikipedia.org/wiki/abstract_syntax_notation_one). |
다른:
| 이름 | 설명 |
|---|---|
operator== 및 operator!= | 평등/불평등에 대한 uuids 비교 |
operator< | 하나의 uuid가 다른 것보다 적은지 비교합니다. 이 작업은 논리적으로 의미가 없지만 uuids를 std :: 세트에 보관해야합니다. |
operator<< | 표준 텍스트 표현을 사용하여 출력 스트림에 UUID를 작성합니다. |
to_string() | UUID의 표준 텍스트 표현으로 문자열을 만듭니다. |
이 라이브러리는 제안 P0959의 구현입니다.
이 제안이 표준위원회와 C ++ 커뮤니티 피드백을 기반으로 발전함에 따라이 라이브러리 구현은 이러한 변경 사항을 반영합니다.
변화의 역사에 대한 제안의 개정 기록을 참조하십시오.
다음은 라이브러리 사용 예 목록입니다.
nil uuid 만들기
uuid empty;
assert (empty.is_nil());새로운 UUID를 만듭니다
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);기본 랜덤 생성기로 새로운 UUID를 만듭니다
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);특정 랜덤 생성기로 새로운 UUID를 만듭니다
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);이름 생성기로 새로운 UUID를 만듭니다
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);문자열에서 uuid를 만듭니다
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);16 바이트 시퀀스에서 UUID를 만듭니다
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");uuids 비교
uuid empty;
uuid id = uuids::uuid_system_generator{}();
assert (empty == empty);
assert (id == id);
assert (empty != id);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());문자열로 변환
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");주문한 연관 컨테이너와 함께 사용합니다
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());정렬되지 않은 연관 컨테이너에서 사용합니다
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());해싱 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)); 생성기를 시드하기 위해 basic_uuid_random_generator 및 std :: random_device를 사용하여 uuids를 생성하는 경우, 이것은 비 결정적이 아닐 수도 있고 실제로 동일한 시퀀스의 숫자를 생성 할 수 있습니다.
STD :: Random_Device는 비 결정적 소스 (예 : 하드웨어 장치)를 구현할 수없는 경우 구현 정의 된 의사 랜덤 번호 엔진으로 구현 될 수 있습니다. 이 경우 각 std :: random_device 객체는 동일한 숫자 순서를 생성 할 수 있습니다.
이것은 Mingw에게 문제가 될 수 있습니다. 버그 85494- mingw에서 random_device 구현은 쓸모가 없습니다. 이것은 GCC 9.2에서 고정되었습니다.
휴대용 대안은 Boost.random 라이브러리를 사용하는 것입니다.
라이브러리는 Windows, Linux 및 Mac OS의 모든 주요 운영 체제에서 지원됩니다.
C ++ 20으로 구축 된 프로젝트에서 라이브러리를 사용하는 경우 std::span 사용할 수 있습니다. 컴파일러에서 헤더를 지원하는 경우 기본적으로 사용됩니다. 점검은 __cpp_lib_span 기능 테스트 매크로로 수행됩니다.
그렇지 않으면 C ++ 17을 사용하여 빌드 할 때 std::span 사용할 수 없습니다. 그러나 Microsoft Guidelines Support Library (일명 GSL)는 span 구현에 사용될 수 있습니다 (표준 버전이 정의 된). std::span 사용할 수없는 경우 STDUUID 라이브러리는 기본적 으로이 구현을 사용합니다.
gsl::span 사용할 수 있도록 GSL 라이브러리를 사용할 수 있는지 확인하고 GSL 포함 디렉토리가 프로젝트의 디렉토리에 나열되어 있습니다.
CMAKE를 사용하여 테스트 프로젝트를 구축하는 경우 UUID_USING_CXX20_SPAN 이라는 변수가 정의되지 않았거나 값이 OFF 있는지 확인하십시오 (이것은 기본값입니다). 이를 통해 gsl 디렉토리가 헤더 디렉토리의 검색 목록에 포함될 것입니다.
테스트 프로젝트는 출처에서 사용할 수 있습니다. 테스트를 구축하고 실행하려면 다음을 수행합니다.
build 디렉토리 생성cmake .. build 디렉토리에서; CMAKE가없는 경우 먼저 설치해야합니다.예
Visual Studio 2019 용 프로젝트 파일을 생성하려면 다음 명령을 실행할 수 있습니다.
cd build
cmake -G "Visual Studio 17" -A x64 ..
운영 체제 UUID 생성기를 활성화하려면 UUID_SYSTEM_GENERATOR 변수를 ON 으로 설정하십시오.
cd build
cmake -G "Visual Studio 17" -A x64 -DUUID_SYSTEM_GENERATOR=ON ..
실험 시간 기반 UUID 생성기를 활성화하려면 UUID_TIME_GENERATOR 변수를 ON 으로 설정하십시오.
cd build
cmake -G "Visual Studio 17" -A x64 -DUUID_TIME_GENERATOR=ON ..
SHA1 구현은 TinySHA1 라이브러리를 기반으로합니다.