Генерация случайных UUID в Linux - PullRequest
10 голосов
/ 01 февраля 2010

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

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

Ответы [ 6 ]

14 голосов
/ 04 апреля 2013

Я что-то упустил? Вы не можете:

cat /proc/sys/kernel/random/uuid
7 голосов
/ 02 февраля 2010

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

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

Что мне было нужно, так это простые 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
6 голосов
/ 13 сентября 2014

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

void uuid_generate(uuid_t out);
void uuid_generate_random(uuid_t out);
3 голосов
/ 01 февраля 2010

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

2 голосов
/ 01 февраля 2010

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

2 голосов
/ 01 февраля 2010

Может быть, ooid поможет? http://ooid.sourceforge.net/

...