Независимое от платформы поколение GUID в C++?
Как лучше всего программно генерировать GUID или UUID в C++, не полагаясь на инструмент для конкретной платформы? Я пытаюсь сделать уникальные идентификаторы для объектов в моделировании, но не могу полагаться на Microsoft, так как проект является кросс-платформенным.
Примечания:
- так как это для симулятора, я на самом деле не нужна криптография случайность.
- было бы лучше, если это 32-битное число.
6 ответов:
в linux: man uuid
on win: проверьте структуру 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, то есть очень минимальная библиотека, которую я реализовал, которая просто действует как оболочка вокруг собственной реализации guid каждой операционной системы. Он должен работать на Windows (используя
CoCreateGuid
), Linux (с использованиемlibuuid
), MacOS (с помощьюCFUUID
), iOS (также с помощьюCFUUID
), и Android (используя вызовы JNI дляjava.util.UUID
). Функция генерации guid имеет различную реализацию в каждой системе, но существует одна общая реализация для сравнения, строкового представления и анализа.он лицензирован MIT и доступен на GitHub:
лучше всего просто использовать любой guid/uuid, присутствующий на целевой платформе. Делать это правильно трудно (давайте ходить по магазинам ;)).
вероятность столкновения между любыми двумя идентификаторами из разных, но хорошо выполненных реализаций должна быть намного выше любого разумного шанса произойти в жизни этой вселенной.
генератор GUID обычно полагается на аппаратные характеристики машины, обычно такие вещи, как MAC-адреса или IP-адреса. Единственное, что вы можете сделать, что абсолютно не зависит от платформы, это использовать какой-то PRNG высевается вручную или высевается из некоторого источника времени. Это обычно не создает истинный глобальный уникальный идентификатор в том смысле, что вам гарантировано, что никто в мире не генерирует тот же номер.
один чудак(?) решение было бы использовать веб-сервис для получения GUID, но я сомневаюсь, что это будет хорошим решением для программы на C++, особенно если она не включена в сеть.
вот URL, который может пригодиться, если вы решите продолжить эту опцию:http://www.hoskinson.net/GuidGenerator/default.asp