Ответ 1
Если вы можете позволить использовать Boost, то есть библиотека UUID, которая должна делать трюк. Это очень просто использовать - проверьте документацию и этот ответ.
Каков наилучший способ программно генерировать GUID или UUID на С++, не полагаясь на инструмент для конкретной платформы? Я пытаюсь сделать уникальные идентификаторы для объектов в симуляции, но не могу полагаться на реализацию Microsoft, поскольку проект является кросс-платформенным.
Примечания:
Если вы можете позволить использовать Boost, то есть библиотека UUID, которая должна делать трюк. Это очень просто использовать - проверьте документацию и этот ответ.
в linux: man uuid
при победе: проверьте структуру UUID и функцию UuidCreate в msdn
[edit] функция будет выглядеть следующим образом
extern "C"
{
#ifdef WIN32
#include <Rpc.h>
#else
#include <uuid/uuid.h>
#endif
}
std::string newUUID()
{
#ifdef WIN32
UUID uuid;
UuidCreate ( &uuid );
unsigned char * str;
UuidToStringA ( &uuid, &str );
std::string s( ( char* ) str );
RpcStringFreeA ( &str );
#else
uuid_t uuid;
uuid_generate_random ( uuid );
char s[37];
uuid_unparse ( uuid, s );
#endif
return s;
}
Если вы не можете позволить использовать Boost, тогда есть очень минимальная библиотека, которую я реализовал, которая просто выступает в роли оболочки для каждой собственной версии операционной системы. Он должен работать в Windows (используя CoCreateGuid
), Linux (используя libuuid
), MacOS (используя CFUUID
), iOS (также используя CFUUID
) и Android (используя JNI-вызовы на java.util.UUID
). Функция генерации направляющих имеет различную реализацию для каждой системы, но для сравнения, подравнивания и синтаксического анализа существует единая общая реализация.
Это лицензия MIT и доступна на GitHub:
Простое использование любого guid/uuid присутствует на целевой платформе. Правильно ли это трудно (отпустите покупки;)).
Вероятность столкновения между любыми двумя идентификаторами из разных, но хорошо выполненных реализаций должна быть значительно выше любых разумных шансов на то, что происходит в этой жизни вселенной.
Генератор GUID обычно использует аппаратные характеристики машины, обычно такие как MAC-адреса или IP-адреса. Единственное, что вы можете сделать, абсолютно независимое от платформы, - использовать какой-то PRNG, засеянный вручную или засеянный из некоторого источника времени. Обычно это не генерирует истинный глобально уникальный идентификатор в том смысле, что вам гарантировано, что никто в мире не генерирует одинаковый номер.
Ну, одно решение (?) должно было бы использовать веб-службу для получения GUID, но я сомневаюсь, что это будет хорошим решением для С++-программы, особенно если она не включена в сеть.
Вот URL, который может пригодиться, если вы решите воспользоваться этой опцией: http://www.hoskinson.net/GuidGenerator/default.asp