ตัวอย่างการสร้าง UUID โดยใช้ Boost ใน C ++


96

ฉันต้องการสร้าง UUID แบบสุ่มเนื่องจากอินสแตนซ์ในโปรแกรมของฉันมีตัวระบุที่ไม่ซ้ำกันเป็นสิ่งสำคัญ ฉันตรวจสอบBoost UUIDแล้ว แต่ไม่สามารถจัดการเพื่อสร้าง UUID ได้เพราะฉันไม่เข้าใจว่าจะใช้คลาสและวิธีการใด

ฉันจะขอบคุณถ้ามีคนให้ตัวอย่างวิธีการบรรลุเป้าหมายนี้

คำตอบ:


167

ตัวอย่างพื้นฐาน:

#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

16
สำหรับ parantheses คู่: ตัวแรกสร้างอินสแตนซ์ของอินสแตนซ์random_generatorที่สองใช้operator()กับอินสแตนซ์นั้น คุณควรบันทึกเครื่องกำเนิดไฟฟ้าและเรียกoperator()ใช้หากคุณต้องการสร้างมากกว่าหนึ่ง uuid:random_generator rg; uuid ui = rg();
Georg Fritzsche

36
@Nikola: ใช้ boost :: uuids :: to_string (uuid) สำหรับ stringifying uuids
King

2
@GeorgFritzsche เวลาที่แน่นอนและที่อยู่เครือข่ายของแต่ละเครื่องจะไม่ซ้ำกัน ดังนั้นฉันจึงอาจเป็นกุญแจสำคัญสำหรับฟังก์ชันแฮช ฉันไม่ต้องการค่าที่ชัดเจนในภายหลัง แต่ความคิดของคุณทำให้ฉันมีความคิด อาจเป็นการดีที่จะใช้เวลาและที่อยู่เครือข่ายเป็นเมล็ดพันธุ์สำหรับตัวสร้างตัวเลขสุ่มหรือมากกว่านั้น
danijar

37

คำตอบของ 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 kumar

2
@Saneeshkumar เป็น "ตัวระบุที่ไม่ซ้ำกันในระดับสากล" ไม่ใช่ "ตัวระบุเฉพาะของเครื่องกำเนิดไฟฟ้านี้" ด้วยเหตุผล
xaxxon

1
เรียนรู้จากฉันและสร้างเธรดเครื่องกำเนิดไฟฟ้าในท้องถิ่น เมล็ดพันธุ์มีราคาแพงมาก
James
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.