使用Boost在C++中生成UUID示例

104
我想生成随机UUID作为程序实例的唯一标识符,因此需要一个只能生成随机UUID的方法。我查看了Boost UUID文档,但是由于不理解该类和方法的用法,所以无法生成UUID。
希望有人可以给我提供一个关于如何生成UUID的示例。
2个回答

189

一个基本的例子:

#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


6
你如何将它赋值给一个字符串?因为我有一个通用的基础,我需要将UUID连接到这个基础上。再次感谢! - Nikola
24
@nik: 使用流支持 - 这里有一个stringstream的例子。或者让boost::lexical_cast<std::string>(uuid)为您完成此操作。 - Georg Fritzsche
17
关于双括号:第一个构造了一个random_generator实例,第二个在该实例上使用了operator()。如果您想生成多个uuid,则应保存生成器并在其上调用operator()random_generator rg; uuid ui = rg(); - Georg Fritzsche
46
请使用 boost::uuids::to_string(uuid) 将 uuid 转换为字符串。 - King
2
@GeorgFritzsche,精确的时间和机器的独特网络地址是唯一的。因此,我认为这可能是哈希函数的好密钥。我以后不需要清晰的值。但是你的想法给了我一个想法。将时间和网络地址用作随机数生成器的种子可能是一个好主意。 - danijar
显示剩余3条评论

43

Georg Fritzsche的答案没问题,但可能有点误导。如果您需要多个uuid,则应重复使用生成器。也许这样更清晰:

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
7
如果使用新的生成器导致唯一性问题,那么这个通用唯一标识符就不会很好。 - xaxxon
@xaxxon,你有关于创建新生成器时唯一性问题的文档吗? - Saneesh kumar
2
@Saneeshkumar,它被称为“通用唯一标识符”,而不是“此生成器唯一标识符”,这是有原因的。 - xaxxon
2
跟我学,让生成器成为线程本地的。它们的种子非常昂贵。 - James
2
官方文档只鼓励重复使用随机生成器以提高性能,而非安全性。 "根据平台不同,在初始化生成器时可能存在设置成本,因此请尽可能重复使用它" 来源: Boost uuid 1.70.0 - Pablo Burgos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接