1 Windows/Linux生成uuid

1.1 uuid

UUID含义是通用唯一识别码(Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。

UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字
UUID由以下几部分的组合:

  • 当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
  • 时钟序列
  • 全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得

UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。

1.2 Windows/Linux生成uuid工具类

本文封装一个在Windows和Linux上生成uuid的工具类UUIDUtils类,该类在Windows上使用CoCreateGuid生成GUID,在Linux上依赖uuid库。

所以在linux上编译需要先安装uuid库,

Ubuntu:

sudo apt-get install uuid-dev

Centos:

yum install uuid uuid-devel
# 或
yum install libuuid libuuid-devel

并使用-luuid链接uuid库,不然会在编译时出现

fatal error: uuid/uuid.h: No such file or directory

错误。

UUIDUtils的源码如下:

UUIDUtils.h

#ifndef _UUID_UTILS_H
#define _UUID_UTILS_H

#include <string>

class UUIDUtils
{
public:
    static std::string GenerateUUID();
};


#endif // !_UUID_UTILS_H

UUIDUtils.cpp

#include "UUIDUtils.h"

#include <stdio.h>
#include <stdint.h>
#include <string>

#if defined(_WIN32)
#include <objbase.h>
#elif defined(__linux__)
#include <uuid/uuid.h>
#else
#error "uuid unsupport platform"
#endif

#define GUID_LEN 64

std::string UUIDUtils::GenerateUUID()
{

#ifdef _WIN32
    char buf[GUID_LEN] = { 0 };
    GUID guid;

    if (CoCreateGuid(&guid))
    {
        return std::move(std::string(""));
    }
    sprintf(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]);

    return std::move(std::string(buf));
#elif __linux__
    char buf[GUID_LEN] = { 0 };

    uuid_t uu;
    uuid_generate(uu);

    int32_t index = 0;
    for (int32_t i = 0; i < 16; i++)
    {
        int32_t len = i < 15 ?
            sprintf(buf + index, "%02X-", uu[i]) :
            sprintf(buf + index, "%02X", uu[i]);
        if (len < 0)
            return std::move(std::string(""));
        index += len;
    }

    return std::move(std::string(buf));
#endif // WIN32

}

参考链接