Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Linux中生成随机UUID_C++_Linux_Guid_Uuid - Fatal编程技术网

C++ 在Linux中生成随机UUID

C++ 在Linux中生成随机UUID,c++,linux,guid,uuid,C++,Linux,Guid,Uuid,我陷入了一种奇怪的困境。我需要在我的Linux程序(使用RPM分发)中生成UUID。我不想通过要求用户安装libuuid来向我的应用程序添加另一个依赖项(似乎libuuid不包括在大多数Linux发行版中,如CentOS) 难道没有生成UUID的标准Linux系统调用吗(比如说,在Windows中有CoCreateGuid)?uuidgen命令使用什么?也许ooid会有所帮助 POSIX中不存在生成UUID的系统调用,但我想您可以在某处找到生成UUID的BSD/MIT代码。ooid是根据Boos

我陷入了一种奇怪的困境。我需要在我的Linux程序(使用RPM分发)中生成UUID。我不想通过要求用户安装libuuid来向我的应用程序添加另一个依赖项(似乎libuuid不包括在大多数Linux发行版中,如CentOS)


难道没有生成UUID的标准Linux系统调用吗(比如说,在Windows中有CoCreateGuid)?uuidgen命令使用什么?

也许ooid会有所帮助

POSIX中不存在生成UUID的系统调用,但我想您可以在某处找到生成UUID的BSD/MIT代码。ooid是根据Boost软件许可证发布的,根据维基百科的说法,Boost软件许可证是BSD/MIT风格的许可证。然后,您可以将其粘贴到应用程序中,而无需添加依赖项。

有什么原因不能静态链接到libuuid吗?

谢谢您的评论

我仔细检查了每一个,以下是最适合我要求的:

我需要的只是简单的基于时间的UUID,它由随机数为安装应用程序的每个用户生成一次。RFC4122中指定的UUID版本4正是它。我按照建议的算法进行了一次测试,并提出了一个非常简单的解决方案,它既适用于Linux,也适用于Windows(可能太简单了,但它确实满足了需要!):


我错过什么了吗?难道你不能:

cat /proc/sys/kernel/random/uuid
我发现(对于linux开发人员)的一个好方法是
#包括
。然后您可以调用几个函数:

void uuid_generate(uuid_t out);
void uuid_generate_random(uuid_t out);

uuidgen
在我的ubuntu linux dist上运行得很好。

我还不能对答案发表评论,但我想指出的是,被接受的答案使用rand()在Windows上根本不起作用,rand_MAX被定义为0x7fff,只提供15位随机性。在Linux上更高,但看起来像是0x7fffffff,提供31位随机性,仍然缺少1位到32位的完整长度

使用rand()最安全的方法是依赖以下事实:任何地方的最低保证rand_MAX值都将是0x7fff——多次调用它,向左移动15位,然后使用新值进行“或”,直到生成所需数量的随机位

此外,
sprintf
中的格式字符串应指定宽度,因此应考虑前导零(宽度基于相应参数注释中提到的位):

此外,该代码生成256位值,而不是与兼容的128位值 RFC4122 UUID

最后评论:

rand() % 0x3fff + 0x8000,       // Generates a 32-bit Hex number in the range [0x8000, 0xbfff]
由于采用模运算,实际产生的范围为[0x8000,0xbffe]。
%
应该是
&
(或者如果使用
%
,则0x3fff应该是0x4000,但是除法的运算成本总是比按位和更高)

以下是代码的修订版本:

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstdint>

uint32_t rand32()
{
    return ((rand() & 0x3) << 30) | ((rand() & 0x7fff) << 15) | (rand() & 0x7fff);
}

bool gen_uuid4(char dst[37], size_t len)
{
    int n = snprintf(dst, len, "%08x-%04x-%04x-%04x-%04x%08x", 
        rand32(),                         // Generates a 32-bit Hex number
        rand32() & 0xffff,                // Generates a 16-bit Hex number
        ((rand32() & 0x0fff) | 0x4000),   // Generates a 16-bit Hex number of the form 4xxx (4 indicates the UUID version)
        (rand32() & 0x3fff) + 0x8000,     // Generates a 16-bit Hex number in the range [0x8000, 0xbfff]
        rand32() & 0xffff, rand32());     // Generates a 48-bit Hex number
        
    return n >= 0 && n < len;             // Success only when snprintf result is a positive number and the provided buffer was large enough.
}

int main()
{
    char strUuid[37];
    srand(time(NULL));
    
    bool success = gen_uuid4(strUuid, sizeof(strUuid));
    
    printf("%s\n", success ? strUuid : "UUID generation failed!");
    
    return 0;
}
#包括
#包括
#包括
#包括
uint32_t rand32()
{

return((rand()&0x3)当然!谢谢你给我指出了正确的方向,我不知道!我没有接受答案,因为我自己想出了这个答案,并且认为它太简单了!!你的术语有点混乱-术语“基于时间的UUID”不是第4版,而是第1版。从理论上讲,使用模0x3fff不会为您提供平滑的输出分布,尽管我怀疑它是否有任何实际意义。因此,如果在同一秒调用此函数两次,它将返回相同的值。您如何处理?非常简单的工作答案…谢谢。也是便携式,可直接在多个平台上工作。@themoondothshine感谢万分。整个下午都在HP-UX上尝试生成UUID,您已经想出了这个超级优雅的解决方案。我冰箱里有一块巧克力蛋糕,我很乐意在一夜之间送给您作为感谢!libuuid似乎是LGPL,所以OP的应用程序也将是必须是LGPL。动态链接避免了许可证要求。除非您讨论的是不同的libuuid。可能无法移植到其他Linux系统。这有多贵?这不是Linux基于硬件的熵池吗?这些通常都很贵。
rand() % 0x3fff + 0x8000,       // Generates a 32-bit Hex number in the range [0x8000, 0xbfff]
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstdint>

uint32_t rand32()
{
    return ((rand() & 0x3) << 30) | ((rand() & 0x7fff) << 15) | (rand() & 0x7fff);
}

bool gen_uuid4(char dst[37], size_t len)
{
    int n = snprintf(dst, len, "%08x-%04x-%04x-%04x-%04x%08x", 
        rand32(),                         // Generates a 32-bit Hex number
        rand32() & 0xffff,                // Generates a 16-bit Hex number
        ((rand32() & 0x0fff) | 0x4000),   // Generates a 16-bit Hex number of the form 4xxx (4 indicates the UUID version)
        (rand32() & 0x3fff) + 0x8000,     // Generates a 16-bit Hex number in the range [0x8000, 0xbfff]
        rand32() & 0xffff, rand32());     // Generates a 48-bit Hex number
        
    return n >= 0 && n < len;             // Success only when snprintf result is a positive number and the provided buffer was large enough.
}

int main()
{
    char strUuid[37];
    srand(time(NULL));
    
    bool success = gen_uuid4(strUuid, sizeof(strUuid));
    
    printf("%s\n", success ? strUuid : "UUID generation failed!");
    
    return 0;
}