Soru C ++ platform bağımsız GUID oluşturma?


Platforma özgü bir araca güvenmeden C ++'da bir GUID veya UUID programlı olarak oluşturmanın en iyi yolu nedir? Bir simülasyondaki nesneler için benzersiz tanımlayıcılar yapmaya çalışıyorum, ancak proje çapraz platform olduğu için Microsoft'un uygulamasına güvenemiyorum.

Notlar:

  • Bu bir simülatör olduğundan, ben şifrelemeye gerçekten gerek yok rastgelelik.
  • Bu 32 bitlik bir sayıysa en iyisi olurdu.

51
2018-02-12 21:17


Menşei


[Soru] 'nun cevabı: stackoverflow.com/questions/543306/... bana daha iyi bir cevap ver. - Vivian De Smedt
Bir GUID tanım olarak 128 bitlik bir sayı. İsterseniz her zaman birinden 32 bit alabilirsiniz, ancak benzersiz veya rastgele olma garantisi yoktur. - Mark Ransom


Cevaplar:


Eğer Boost kullanmak için paran varsa, o zaman bir UUID hile yapması gereken kütüphane. Kullanımı çok basit - belgeleri kontrol edin ve bu cevap.


45
2018-02-12 21:26



Tam olarak ne için umuyordum. Teşekkürler - Moses Schwartz
Tartışmayı okumak ve koda bakmak, bunun hala çok ön hazırlık olduğunu hissetmem. Özellikle API irade değişim ve zaman tabanlı UUID oluşturma yoksundur. Bununla birlikte, yaklaşım iyi ve uyarlanabilirdir ve uygulama sağlamdır (not edilen yarış koşulları hariç). - Konrad Rudolph
Evet, en az iki takip tartışması vardı - arayüzlerle ilgili konulardan biri, lexical_cast, vs, diğeri PODness hakkındaydı. Onları takip etmedim. - Anonymous
Merhaba anon, bu iki sorun (PODness ve lex_cast) hem şimdi hem de çok zarif bir şekilde çözüldü. :-) Her neyse, bu referansı ilk etapta göndermiş olmanızdan dolayı çok mutluyum: Bunu çok kullanabiliyorum ve yapacağım. Beklenen sorunların yakında çözüleceğinden eminim. - Konrad Rudolph
Kütüphaneyi Boost'tan bağımsız olarak kullanmak mümkün mü? Bana sadece Guids almak için bir projeye Boost eklemek için fazla kilolu görünüyor! - sergiol


linux üzerinde: adam uuid

win: msdn içinde UUID yapısı ve UuidCreate işlevine göz atın

[düzenle] işlev böyle görünecekti

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;
}

36
2017-10-26 17:56



Not: Visual Studio C ++ uygulamasında, "dil uzantılarını devre dışı bırak", HAYIR olarak ayarlanmalıdır. Yine de, çözülmemiş extern hataları alıyorum. Hangi kütüphaneleri içermek zorundayım ve nasıl? - Jive Dadson
rpcrt4 ihtiyacınız olan lib. Bu kod zaten gcc + mingw ile derlendi. - ubik


Eğer Boost'u kullanmak için paranız yoksa, o zaman uyguladığım her bir işletim sisteminin yerel guid uygulaması etrafında bir sarıcı görevi gören çok az bir kütüphane var. Windows üzerinde çalışmalı (kullanarak CoCreateGuid), Linux (kullanarak libuuid), MacOS (kullanarak CFUUID), iOS (kullanarak CFUUID) ve Android (JNI çağrılarını kullanarak java.util.UUID). Kılavuz oluşturma işlevi her sistemde farklı bir uygulamaya sahiptir, ancak karşılaştırma, dizgeleme ve ayrıştırma için tek bir genel uygulama vardır.

MIT lisanslı ve GitHub'da mevcut:

https://github.com/graeme-hill/crossguid


12
2018-06-01 01:04





Sadece hedef platformda hangi guid / uuid varsa onu kullanmak en iyisidir. Doğru yapmak zor (alışverişe gidelim;)).

Farklı fakat iyi uygulanmış uygulamalardan herhangi iki tanımlayıcı arasında bir çarpışma olasılığı, bu evrenin yaşamında gerçekleşebilecek herhangi bir makul şansın ötesinde olmalıdır.


2
2018-02-12 21:25



Eğer 32 bitlik bir sayıyla (işbirliği olmadan) teklik istiyorsanız, bir probleminiz var demektir. Aralığı bölüştürmek ve gerektiğinde onları atamak tek yol hakkında ... - ShuggyCoUk


Bir GUID jeneratörü genellikle makinenin donanım özelliklerine, genellikle MAC adresleri veya IP'ler gibi özelliklere dayanır. Kesinlikle platform bağımsız olarak yapabileceğiniz tek şey bir çeşit kullanmanızdır. PRNG manuel olarak tohumlanır veya bir zaman kaynağından tohumlanır. Bu, genellikle dünyada hiç kimsenin aynı sayıyı üretmediğinin garantilenmesi açısından gerçek anlamda küresel olarak benzersiz bir tanımlayıcı üretmez.


1
2018-02-12 21:24





Iyi bir sıra dışı (?) Çözüm GUID almak için bir web hizmeti kullanmak olurdu ama bu ağ etkin değil, özellikle bir C + + programı için iyi bir çözüm olacağını şüpheliyim.

Bu seçeneği izlemeyi tercih ederseniz, kullanışlı olabilecek bir URL: http://www.hoskinson.net/GuidGenerator/default.asp


-1
2018-02-12 21:36