Платформенно независимое поколение GUID в C++?

На основании ответа @ Staale и, пытаясь не полагаться на сторонние библиотеки, я бы выполнил подход файловой системы, проверив физическое местоположение первого пакета с помощью:

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
...
Class[] foundClasses = new Class[0];
final ArrayList> foundClassesDyn = new ArrayList>();

new java.io.File(
    klass.getResource(
        "/" + curPackage.replace( "." , "/")
    ).getFile()
).listFiles(
    new java.io.FileFilter() {
        public boolean accept(java.io.File file) {
            final String classExtension = ".class";

            if ( file.isFile()
                && file.getName().endsWith(classExtension)
                // avoid inner classes
                && ! file.getName().contains("$") )
            {
                try {
                    String className = file.getName();
                    className = className.substring(0, className.length() - classExtension.length());
                    foundClassesDyn.add( Class.forName( curPackage + "." + className ) );
                } catch (ClassNotFoundException e) {
                    e.printStackTrace(System.out);
                }
            }

            return false;
        }
    }
);

foundClasses = foundClassesDyn.toArray(foundClasses);

54
задан Moses Schwartz 12 February 2009 в 21:25
поделиться

5 ответов

Если можно позволить себе использовать Повышение, то существует библиотека UUID , которая должна добиться цели. Это очень просто для использования - проверяют документацию и этот ответ .

45
ответ дан Community 7 November 2019 в 17:58
поделиться

Просто использование безотносительно guid/uuid присутствует на целевой платформе, является лучшим. Делать правильно его трудно (давайте пойдем по магазинам ;)).

вероятность коллизии между любыми двумя идентификаторами от различных но хорошо выполняемых реализаций должна быть далеко за пределами любого разумного шанса случая во время жизни этой вселенной.

2
ответ дан ShuggyCoUk 7 November 2019 в 17:58
поделиться

Хорошо одно оригинальное (?) решение состояло бы в том, чтобы использовать веб-сервис для получения GUID, но я сомневаюсь, что это будет хорошим решением для программы C++ особенно, если это не будет включенная сеть.

Вот URL, который мог бы пригодиться, если Вы принимаете решение преследовать эту опцию: http://www.hoskinson.net/GuidGenerator/default.asp

-1
ответ дан Autodidact 7 November 2019 в 17:58
поделиться

Генератор GUID обычно полагается на характеристики оборудования машины, обычно наполняйте как MAC-адреса или дюйм/с. Единственной вещью, которую можно сделать, который абсолютно независим от платформы, является использование некоторый PRNG, отобранный вручную или отобранный из источника некоторого времени. Это обычно не генерирует истинный глобально уникальный идентификатор в том смысле, что Вам гарантируют это, никто в мире не генерирует то же число.

1
ответ дан shoosh 7 November 2019 в 17:58
поделиться

в linux: man uuid

в win: проверьте структуру UUID и функцию UuidCreate в msdn

[править] функция будет выглядеть так

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;
}
40
ответ дан 26 November 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: