C ++에서 Boost를 사용한 UUID 생성의 예


94

내 프로그램의 인스턴스가 고유 식별자를 갖는 것이 중요하기 때문에 임의의 UUID를 생성하고 싶습니다. Boost UUID를 살펴 보았지만 어떤 클래스와 메서드를 사용해야하는지 이해하지 못해 UUID를 생성 할 수 없습니다.

누군가가 이것을 달성하는 방법에 대한 예를 줄 수 있다면 감사하겠습니다.

답변:


165

기본 예 :

#include <boost/uuid/uuid.hpp>            // uuid class
#include <boost/uuid/uuid_generators.hpp> // generators
#include <boost/uuid/uuid_io.hpp>         // streaming operators etc.

int main() {
    boost::uuids::uuid uuid = boost::uuids::random_generator()();
    std::cout << uuid << std::endl;
}

출력 예 :

7feb24af-fc38-44de-bc38-04defc3804de


4
그리고 그것을 문자열에 어떻게 할당할까요? 모든 인스턴스에 대한 공통 기반이 있고 UUID를 기반에 연결해야하기 때문입니다. 다시 한 번 감사드립니다!
Nikola

22
@nik : 스트리밍 지원 사용 - stringstream예가 있습니다. 아니면 boost::lexical_cast<std::string>(uuid)당신을 위해 그렇게 합시다 .
Georg Fritzsche

15
이중 괄호 : 첫 번째는의 인스턴스를 생성 random_generator하고 두 번째는 operator()해당 인스턴스에서 사용 합니다. 당신은 발전기 및 호출 저장해야합니다 operator(): 둘 이상의 UUID 생성 할 경우에을random_generator rg; uuid ui = rg();
게오르그 FRITZSCHE

34
@Nikola : uuids 문자열 화를 위해 boost :: uuids :: to_string (uuid) 사용
King

2
@GeorgFritzsche 함께 정확한 시간과 시스템의 개별 네트워크 주소는 고유합니다. 따라서 해시 함수에 대한 좋은 키가 될 수 있습니다. 나중에 명확한 값이 필요하지 않습니다. 하지만 당신의 아이디어는 나에게 아이디어를 가져 왔습니다. 시간과 네트워크 주소를 난수 생성기의 시드로 사용하는 것이 좋을 수 있습니다.
danijar aug

34

Georg Fritzsche의 대답은 괜찮지 만 약간 오해의 소지가 있습니다. 둘 이상의 uuid가 필요한 경우 생성기를 다시 사용해야합니다. 이 방법이 더 명확 할 수 있습니다.

#include <iostream>

#include <boost/uuid/uuid.hpp>            // uuid class
#include <boost/uuid/uuid_generators.hpp> // generators
#include <boost/uuid/uuid_io.hpp>         // streaming operators etc.


int main()
{
    boost::uuids::random_generator generator;

    boost::uuids::uuid uuid1 = generator();
    std::cout << uuid1 << std::endl;

    boost::uuids::uuid uuid2 = generator();
    std::cout << uuid2 << std::endl;

    return 0;
}

1
발전기를 재사용해야하는 이유는 무엇입니까? 이것은 성능 최적화 또는 안전 팁입니까?
Fred

5
새로운 생성기를 사용하여 고유성 문제가 발생하면 범용 고유 ID가 좋지 않습니다.
xaxxon

@xaxxon 새 생성기를 만들 때 고유성 문제에 관한 문서가 있습니까?
Saneesh 쿠마

2
@Saneeshkumar 이유 때문에 "이 생성기 고유 식별자"가 아니라 "범용 고유 식별자"입니다.
xaxxon

1
나에게서 배우고 생성기를 로컬 스레드로 만드십시오. 시드 비용이 매우 비쌉니다
James
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.