在C语言中简单生成GUID

11

我觉得GUID/UUID问题已经被讨论过很多次了,但是我似乎找不到我需要的东西。我需要一个在C语言中生成V4 GUID的函数,也就是说,它与C#中的Guid.NewGuid基本上是兼容的。

这必须在Windows(XP、Server 2003/8等)和3个不同版本的Unix(AIX、Sun和HP)上工作。

我看过一些规范白皮书,甚至有一些示例实现,但总是存在适当的随机数问题,或者它们只生成V1或V3 UUID等等。UUID的维基百科页面指向了一些示例库,但对于我想要完成的任务来说,这些库太重了。

我相信我自己可以实现一些东西,但如果有什么简单轻量级的东西可以直接使用,我不想浪费时间重新发明轮子。有人有什么东西或知道什么东西吗?

谢谢。

2个回答

12

CoCreateGuid 是Windows所有形式的标准。Linux的标准是libuuid,它在所有Linux版本上都是标准且应该很轻量级。我不知道有哪个库可以同时适用于Windows和Unix。我认为对于Windows和Linux,#if分支实际上是适当的。


1
你是否真的需要在两个系统上分发相同的二进制文件?还是只需编译相同的源代码?你的问题没有具体说明。如果你确实需要分发相同的二进制文件,那么你可能可以获取libuuid的源代码并将其编译到你的二进制文件中,这将使它跨平台。 - JSBձոգչ
3
这个东西是跨平台的。你需要在一个公共接口下包装一些特定于操作系统的API。最终,你需要在每个操作系统类型下编译应用程序,因此编译时切换以选择相同接口的正确实现即可完成工作。我知道一些好的库使用了这个“技巧”。例如看看boost::thread。 - Cătălin Pitiș
只需编译相同的源代码...使用#if分支是完全可以接受的。这是一个保证我的Unix发行版将拥有libuuid吗?我实际上没有能力强制所有客户安装它,甚至不能正确打包它。 - Morinar
1
Morinar:您可以始终静态链接到libuuid。 - John Ledbetter
好的,感谢我的另一个问题(https://dev59.com/XEnSa4cB1Zd3GeqPLzN5)的帮助,我确定libuuid在Sun系统上,但不在AIX或HPUX上。我也能够轻松实现Windows解决方案。假设我将不得不跳过一些链接障碍或类似的事情。仍然希望有更简单的方法... - Morinar
显示剩余3条评论

2
事实上,CoCreateGuid() 调用了 UuidCreate()。生成的数据类型(UUID,GUID) 是完全相同的。在 Windows 上,你可以使用这两个函数来创建 GUID。

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