Генерация случайных UUID в Linux
Я застрял в странном положении. Мне нужно создать UUID в моей программе Linux (которую я распространяю с помощью RPMs). Я не хочу добавлять другую зависимость к моему приложению, требуя от пользователя установить libuuid (похоже, libuuid не входит в большинство дистрибутивов Linux, например CentOS).
разве нет стандартного системного вызова Linux, который генерирует UUID (например, в Windows есть CoCreateGuid)? Что использует команда uuidgen?
6 ответов
Спасибо за все ваши комментарии!
Я прошел через каждый из них, и вот что лучше всего соответствовало моему требованию:
что мне было нужно, так это простые временные 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);
в POSIX нет системного вызова для генерации UUID, но я думаю, вы можете найти где-то код BSD/MIT для генерации UUID. ooid выпускается под лицензией Boost software, которая, согласно Википедии, является разрешительной лицензией в стиле BSD/MIT. Затем вы можете просто вставить его в свое приложение без необходимости добавления зависимостей.