crossguid, 轻量级跨平台 C++ guid/uuid库

分享于 

9分钟阅读

GitHub

  繁體 雙語
Lightweight cross platform C++ GUID/UUID library
  • 源代码名称:crossguid
  • 源代码网址:http://www.github.com/graeme-hill/crossguid
  • crossguid源代码文档
  • crossguid源代码下载
  • Git URL:
    git://www.github.com/graeme-hill/crossguid.git
    Git Clone代码到本地:
    git clone http://www.github.com/graeme-hill/crossguid
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/graeme-hill/crossguid
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    CrossGuid

    CrossGuid是一个最小,跨平台,C++ GUID库。 它使用给定平台上最好的本地 guid/uuid生成器,并具有用于解析。stringifying和比较id的通用类。 guid生成技术由下面的预处理器标志之一确定:

    • GUID_LIBUUID - 使用通常在linux上使用但在其他地方可用的libuuid
    • GUID_CFUUID - 使用来自apple框架 CoreFoundationCFCreateUUID。 这在macosx和iOS上都能工作。
    • GUID_WINDOWS - 在 Windows 中使用内置的CoCreateGuid 函数。
    • GUID_ANDROID - 使用JNI从androidsdk调用Java函数。

    版本

    这是CrossGuid的版本 0.2. 如果你都使用 CrossGuid,并且代码使用 GuidGenerator,那么你使用的是版本 0.1. 版本 0.2的差异:

    • 将所有内容放入命名空间 xg,而不是使用全局名称空间。
    • 移除 GuidGenerator 类并用自由函数 xg::newGuid 替换。 this originally,因为Android是一个特殊的雪花,需要状态( JNIEnv * ),所以在Android上运行时,我就会把这个类存储到 somewhere。 然而,这基本上意味着为了一个平台使库变得复杂。 在 0.2版本中,目标是为普通平台设计,让Android变得怪异。 在Android中,你只需要在创建任何guid之前运行 xg::initJni(JNIEnv *)JNIEnv * 只是作为全局变量存储。
    • 添加了CMake构建系统。为每个平台instead不同的脚本,只需运行 CMake,它应该能够处理每个平台的( 除了那些特殊的机器人)。
    • 实际的guid字节存储在 std::array<unsigned char, 16> 而不是 std::vector<unsigned char>
    • 更多错误检查( 如果试图创建具有无效字节数的guid,则为)。

    如果你很高兴使用版本 0.1,那么就没有什么理由来改变。

    编译

    只要做正常的事情:

    
    mkdir build
    
    
    cd build
    
    
    cmake.. 
    
    
    make
    
    
    
    

    运行测试

    按照上述描述进行编译后,你应该得到两个文件: libxg.a (。static 库) 和 xgtest ( 测试 runner )。 因此,运行测试只需执行以下操作:

     
    ./xgtest
    
    
    
     

    基本用法

    创建 guid

    创建一个新的随机 guid:

    auto g = xg::newGuid();

    注意:Android上需要先调用 xg::initJni(JNIEnv *),这样 xg::newGuid() 才能调用java库。 仅当进程启动时,才需要调用 initJni 一次。

    创建新的零 guid:

    xg::Guid g;

    从字符串创建:

    xg::Guid g("c405c66c-ccbb-4ffd-9b62-c286c0fd7a3b");

    检查有效性

    如果有字符串值,并且需要检查它是否是有效的guid,则可以简单地尝试构造 guid:

    xg::Guid g("bad-guid-string");if (!g.isValid())
    {
     // do stuff}

    如果guid字符串无效,则所有字节都设置为零,isValid() 返回 false

    将guid转换为字符串

    首先,通常没有理由将guid转换为字符串,除非在调试或者序列化API调用时进行序列化。 你绝对应该避免将guid存储为字符串或者使用字符串进行任何计算。 如果需要将guid转换为字符串,则可以使用字符串,因为 << 运算符已经重载。 要将guid打印到 std::cout:

    voiddoGuidStuff(GuidGenerator generator)
    {
     auto myGuid = generator.newGuid();
     std::cout <<"Here is a guid: " <<myGuid <<std::endl;
    }

    或者在 std::string 中存储 guid:

    voiddoGuidStuff(GuidGenerator generator)
    {
     auto myGuid = generator.newGuid();
     std::stringstream stream;
     stream <<myGuid;
     auto guidString = stream.str();
    }

    还有一个 str() 函数返回一个 std::string:

    std::string guidStr = xg::newGuid().str();

    从原始字节创建 guid

    你不可以能需要这样做,但是这是在库内部完成的,从构建的系统guid生成函数中构造一个 Guid 对象。 有两个主要的构造函数:

    Guid(std::array<unsignedchar, 16> &bytes);

    Guid(constunsignedchar * bytes);

    如果可能的话,首选 std::array 构造函数,因为它更安全。 如果你传入一个大小不正确的array,那么坏事会发生。

    比较 guid

    ==!= 已经实现,因此如下所示:

    voiddoGuidStuff(GuidGenerator generator)
    {
     auto guid1 = generator.newGuid();
     auto guid2 = generator.newGuid();
     auto guidsAreEqual = guid1 == guid2;
     auto guidsAreNotEqual = guid1!= guid2;
    }

    Linux

    Linux版本使用proprocessor标志 GUID_LIBUUID

    在linux上,你可以使用非常标准的libuuid。 对于像Ubuntu这样的发行版,默认情况下是可用的,但是要使用它,你需要头文件,因此你必须执行以下操作:

    
    sudo apt-get install uuid-dev
    
    
    
    

    /ios

    使用预处理程序标志 GUID_CFUUID的Mac和iOS版本的价格为

    在Mac或者iOS上,你可以从 CoreFoundation 使用 CFUUIDCreate。 因为它是一个简单的C 函数,你甚至不需要编译为 Objective-C++。

    Windows

    使用预处理器标志 GUID_WINDOWS的Windows 版本的

    在 Windows 上,我们只使用内置函数 CoCreateGuid。 如果你的项目是你的项目,则可以生成 Visual Studio 项目。

    Android

    安卓版本使用预处理器标志( GUID_ANDROID )

    Android版本使用 JNIEnv 对象的句柄从 C++ 调用 java.util.UUID 上的randomUUID() 函数。 Android特定的代码都在 android/ 子目录中。 如果 模拟器 已经运行,那么你可以在 root 目录中运行 android.sh 脚本。 它具有以下要求:

    • Android 模拟器 已经在运行( 或者你有物理设备连接)。
    • 你使用 bash。
    • adb在你的路径中。
    • 你有一个包含 ANDROID_HOME 环境变量的安卓sdk设置。

    许可证

    麻省理工学院许可证( MIT )

    版权所有( c ) 2014 Graeme希尔( http://graemehill.ca )

    若要在取得该软件副本时免费授予任何人,如有下列条件的软件,请免费授予该软件的副本,并与相关的文档文件("软件") 进行许可,包括不受限制的权利,包括以下条件:

    上述版权声明和本许可声明须包括在所有的副本或实质性部分的软件。

    软件是"是",没有任何保证,表示或者隐含,包括但不限于销售,适合特定用途和 NONINFRINGEMENT。 作者或者版权持有人在合同。侵权或者它的他与软件或者它的他用户交易的行为。


    Light  平台  gui  GUID  跨平台  
    相关文章