关于Linux C - UUID

use*_*073 -2 c linux uuid

#include <stdio.h>
#include <stdlib.h>  
#include <uuid/uuid.h>

int main(void) {
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
    uuid_t uuid;
    int uuid_generate_time_safe(uuid);
    printf("%x",uuid);
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么uuid不是16字节长?我用DEBUG查看内存,确实不是16字节.我使用libpcap开发我的程序,uuid并不是唯一的.

Kei*_*son 11

我刚刚在我的系统上尝试过你的程序,uuid 长度为 16个字节.但是你的程序没有显示它的大小.

这条线:

int uuid_generate_time_safe(uuid);
Run Code Online (Sandbox Code Playgroud)

不是对uuid_generate_time_safe函数的调用,它是该函数的声明,uuid作为单个参数的(忽略)名称.(而且这种功能声明在1999年的标准中甚至没有效率,它取消了旧的"隐含int"规则.)

你的printf电话:

printf("%x",uuid);
Run Code Online (Sandbox Code Playgroud)

有不确定的行为; "%x"需要一个类型的参数unsigned int.

如果你查看/usr/include/uuid/uuid.h,你会看到定义uuid_t是:

typedef unsigned char uuid_t[16];
Run Code Online (Sandbox Code Playgroud)

uuid_generate_time_safe(见man uuid_generate_time_safe)的正确声明是:

int uuid_generate_time_safe(uuid_t out);
Run Code Online (Sandbox Code Playgroud)

您不需要在自己的代码中声明该声明; 它是由#include <uuid/uuid.h>.提供的.因为uuid_t是数组类型,所以参数实际上是类型unsigned char*,这就是函数看似能够修改其参数的原因.

这是一个更正确的程序,说明了该函数的用法:

#include <stdio.h>
#include <uuid/uuid.h>

int main(void) {
    uuid_t uuid;
    int result = uuid_generate_time_safe(uuid);
    printf("sizeof uuid = %d\n", (int)sizeof uuid);
    // or: printf("sizeof uuid = %zu\n", sizeof uuid);
    if (result == 0) {
        puts("uuid generated safely");
    }
    else {
        puts("uuid not generated safely");
    }
    for (size_t i = 0; i < sizeof uuid; i ++) {
        printf("%02x ", uuid[i]);
    }
    putchar('\n');
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的系统上,我得到以下输出:

sizeof uuid = 16
uuid not generated safely
26 9b fc b8 89 35 11 e1 96 30 00 13 20 db 0a c4
Run Code Online (Sandbox Code Playgroud)

有关可能出现"未安全生成uuid"消息的原因的信息,请参见手册页.

请注意,我必须安装该uuid-dev软件包才能构建和运行此程序.