当前位置:C++技术网 > 资讯 > C++创建GUID的的代码实现(C语言版和MFC版)

C++创建GUID的的代码实现(C语言版和MFC版)

更新时间:2016-10-09 17:05:33浏览次数:1+次

    在需要创建一个不会重复的ID时,我们通常会根据我们的业务规则来逐个因素来确定生成一串唯一的字符串,作为唯一的ID。然而有时候将各种因素加进来也是一件麻烦的事情,更何况一般时候ID只要是唯一就行了,不需要参入业务数据。因为你参入业务数据的时候,你就必须要获取到对应的数据,然后才能创建这样的唯一字符串。然而,并不是每时每刻都可以方便的获取那些业务数据的。
    在给mysql数据库添加记录的时候,我需要获取自动增长的记录ID,然而添加记录后还要根据合适的条件去获取刚添加的记录ID。因为是自动增长和生成的,所以,获取起来就多了一个步骤。既然这样,那还不如想个办法直接创建一个唯一的ID,然后添加到记录里。因为是自己创建的,所以你在添加记录时就已经得到了这个唯一的ID。
    前面说的通过业务的各个因素来混合确定唯一的ID,然而是不方便的。如果对于长度没有要求,那使用GUID就是个不错的选择。而且,创建GUID和你业务无关,所以随时可以创建。而且GUID基本是都是唯一的,不会重复的,所以可以满足要求。
    对于GUID的介绍,直接引用百度百科的一段介绍吧:
    全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。GUID一词有时也专指微软对UUID标准的实现。
    在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。

    那么现在的目标就是,用代码实现。因为C++并没有现成的简单内置的类来做这件事情,所以很多时候想起来,可能是有那么点困难。那么我就在此将这个代码分享出来,方便大家参考和自己日后查询。
    分别提供C语言版本和MFC版的函数,供不同场合使用。

C语言版:
#include <objbase.h>
const char* CreateGUID()  
{  
    static char buf[64] = {0};
    CoInitialize(NULL);
    GUID guid;  
    if (S_OK == ::CoCreateGuid(&guid))  
    {  
        _snprintf(buf, sizeof(buf)  
            , "%08X%04X%04x%02X%02X%02X%02X%02X%02X%02X%02X"  
            , guid.Data1,guid.Data2,guid.Data3  
            , guid.Data4[0], guid.Data4[1] , guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]  
        );  
    }
    CoUninitialize();
    return (const char*)buf;  
}

MFC版:
CString CreateGUID()
{  
    CString str;
    CoInitialize(NULL);
    GUID guid;  
    if (S_OK == ::CoCreateGuid(&guid))  
    {
        str.Format(_T("%08X%04X%04x%02X%02X%02X%02X%02X%02X%02X%02X"),guid.Data1,guid.Data2,guid.Data3,guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5],guid.Data4[6],guid.Data4[7]);
    }
    else
    {
        str="null";
    }
    CoUninitialize();
    return str;  
}

    说明:格式化的字符串并不需要在中间加-或者在两边加{},那只是一个写法而已。我们只要一个唯一的字符串,去掉{}和-。这里创建GUID用到了COM组件,所以才有CoInitialize()初始化COM环境和CoUninitialize()解除COM环境。CoCreateGuid函数就是真正创建GUID的函数,实际上就这么简单。只是整个函数可能不熟的人还是感觉有点难。不过我们这里已经将代码封装成函数了,所以使用起来也是非常简单。你不懂也没有关系,直接就可以用。