• 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 问题反馈可发送邮件到stubbornhuang@qq.com

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 工资「喂饱肚子」,副业「养活灵魂」!

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

C++ – Windows/Linux生成uuid(通用唯一识别码)

C++ 发布于2022-04-28 阅读 8,296次 0次评论 2次点赞 本文共1917个字,阅读需要5分钟。

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

}

参考链接

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:C++ – Windows/Linux生成uuid(通用唯一识别码)

原文链接:https://www.stubbornhuang.com/2112/

发布于:2022年04月28日 15:43:32

修改于:2023年06月26日 20:13:32

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
Linux - 编译Crypto++加密库
Linux运维
下一篇
资源分享 - 3D游戏与计算机图形学中的数学方法 第3版 PDF下载
计算几何与计算机图形学资源
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号