Генерация случайных UUID в Linux

Я застрял в странном положении. Мне нужно создать UUID в моей программе Linux (которую я распространяю с помощью RPMs). Я не хочу добавлять другую зависимость к моему приложению, требуя от пользователя установить libuuid (похоже, libuuid не входит в большинство дистрибутивов Linux, например CentOS).

разве нет стандартного системного вызова Linux, который генерирует UUID (например, в Windows есть CoCreateGuid)? Что использует команда uuidgen?

6 ответов


Я что-то пропустила? Не можете ли вы:

cat /proc/sys/kernel/random/uuid

Спасибо за все ваши комментарии!

Я прошел через каждый из них, и вот что лучше всего соответствовало моему требованию:

что мне было нужно, так это простые временные UUID, которые были созданы из случайных чисел один раз для каждого пользователя, который установил приложение. UUID версии 4, как указано в RFC 4122, был именно им. Я прошел предложенный алгоритм и придумал довольно простое решение, которое будет работать как в Linux, так и в Windows (возможно, слишком упрощенное, но это удовлетворяет потребность!):

srand(time(NULL));

sprintf(strUuid, "%x%x-%x-%x-%x-%x%x%x", 
    rand(), rand(),                 // Generates a 64-bit Hex number
    rand(),                         // Generates a 32-bit Hex number
    ((rand() & 0x0fff) | 0x4000),   // Generates a 32-bit Hex number of the form 4xxx (4 indicates the UUID version)
    rand() % 0x3fff + 0x8000,       // Generates a 32-bit Hex number in the range [0x8000, 0xbfff]
    rand(), rand(), rand());        // Generates a 96-bit Hex number

хороший способ, который я нашел (для Linux dev), - это #include <uuid/uuid.h>. Тогда у вас есть несколько функций, которые можно вызвать:

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

есть ли причина, по которой вы не можете просто связать статически с libuuid?


возможно, ooid поможет? http://ooid.sourceforge.net/


в POSIX нет системного вызова для генерации UUID, но я думаю, вы можете найти где-то код BSD/MIT для генерации UUID. ooid выпускается под лицензией Boost software, которая, согласно Википедии, является разрешительной лицензией в стиле BSD/MIT. Затем вы можете просто вставить его в свое приложение без необходимости добавления зависимостей.