问题 在C中简单生成GUID


我觉得这里的GUID / UUID问题已经完成,但我似乎无法找到我正在寻找的东西。我需要一个能在C中生成V4 GUID的函数,即与C#中的Guid.NewGuid基本兼容的函数。

这必须适用于Windows(XP,Server 2003/8等)和3种不同的Unix发行版(AIX,Sun和HP)。

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

我非常强烈地感觉到我可以自己实现一些东西,但是如果有一些非常简单和轻量的东西我可以放弃,我不想浪费时间重新发明轮子。任何人都有东西或知道什么?

谢谢。


1217
2017-09-03 19:03


起源



答案:


CoCreateGuid 是所有形式的Windows的标准。 Linux标准是 libuuid,这是所有Linux版本的标准,应该是轻量级的。我不知道任何适用于Windows和Unix的库。我觉得那个 #if Windows和Linux的分支在这里实际上是合适的。


10
2017-09-03 19:04



你真的需要在两个系统上分配相同的二进制文件吗?或者只是编译相同的源?你的问题没有说明。如果你真的需要分发相同的二进制文件,那么你可以获得libuuid的源代码并将其编译成你的二进制文件,这将使它成为跨平台的。 - JSBձոգչ
@Morinar:这个 是 平台独立。您可以在一个通用接口下包装一些特定于OS的API。最后,您需要在每个OS类别下编译应用程序,因此编译时间开关用于选择相同接口的正确实现应该完成工作。我知道一些好的库使用这个“技巧”。例如,请参阅boost :: thread。 - Cătălin Pitiș
只需编译相同的源... #if分支是完全可以接受的。是否保证我的Unix发行版会有libuuid?我真的没有能力强迫所有客户安装它甚至正确打包它。 - Morinar
Morinar:你总是可以静态链接到libuuid。 - John Ledbetter
当我发表我的第一条评论时,整个答案是:CoCreateGuid他是否添加了更多或者SO有某种问题,我不确定。我当然在他的完整答案出现之后删除了我的第一条评论,现在为我最初的答复而仓促道歉。 - Morinar


答案:


CoCreateGuid 是所有形式的Windows的标准。 Linux标准是 libuuid,这是所有Linux版本的标准,应该是轻量级的。我不知道任何适用于Windows和Unix的库。我觉得那个 #if Windows和Linux的分支在这里实际上是合适的。


10
2017-09-03 19:04



你真的需要在两个系统上分配相同的二进制文件吗?或者只是编译相同的源?你的问题没有说明。如果你真的需要分发相同的二进制文件,那么你可以获得libuuid的源代码并将其编译成你的二进制文件,这将使它成为跨平台的。 - JSBձոգչ
@Morinar:这个 是 平台独立。您可以在一个通用接口下包装一些特定于OS的API。最后,您需要在每个OS类别下编译应用程序,因此编译时间开关用于选择相同接口的正确实现应该完成工作。我知道一些好的库使用这个“技巧”。例如,请参阅boost :: thread。 - Cătălin Pitiș
只需编译相同的源... #if分支是完全可以接受的。是否保证我的Unix发行版会有libuuid?我真的没有能力强迫所有客户安装它甚至正确打包它。 - Morinar
Morinar:你总是可以静态链接到libuuid。 - John Ledbetter
当我发表我的第一条评论时,整个答案是:CoCreateGuid他是否添加了更多或者SO有某种问题,我不确定。我当然在他的完整答案出现之后删除了我的第一条评论,现在为我最初的答复而仓促道歉。 - Morinar


实际上CoCreateGuid()调用 UuidCreate()。生成的数据类型(UUID,GUID) 完全一样。在Windows上,您可以使用这两个函数来创建GUID


2
2017-09-12 07:35