C++ – Windows/Linux生成uuid(通用唯一识别码)
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ – Windows/Linux生成uuid(通用唯一识别码)
原文链接:https://www.stubbornhuang.com/2112/
发布于:2022年04月28日 15:43:32
修改于:2022年04月28日 15:44:38
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
}
参考链接
当前分类随机文章推荐
- 计算几何 - C++计算两个二维向量的夹角 阅读4347次,点赞3次
- C++STL容器 - std::vector构造方式与分配值方式总结 阅读843次,点赞0次
- C++11 - 快速学会正则表达式 阅读1418次,点赞2次
- C++11 - 使用std::codecvt进行字符编码转换需要注意的时间效率问题 阅读1925次,点赞2次
- C++ - 导出接口函数和导出C++类 阅读395次,点赞0次
- C++ - 将一维数组/二维数组/三维数组作为函数参数传递给函数 阅读1636次,点赞0次
- C++ - 在Windows/Linux上创建单级目录以及多级目录的跨平台方法 阅读1158次,点赞0次
- C++11/std::shared_ptr - 循环引用问题 阅读4166次,点赞0次
- C++ - 使用宏区分不同系统平台、不同编译器、不同编译模式等编译期宏使用总结 阅读1397次,点赞0次
- C++ - 一文搞懂std::future、std::promise、std::packaged_task、std::async的使用和相互区别 阅读335次,点赞0次
全站随机文章推荐
- 资源分享 - Physics Modeling for Game Programmers 英文高清PDF下载 阅读1679次,点赞0次
- 资源分享 - 动手学深度学习(李沐 2020年05月08日)PDF下载 阅读2392次,点赞0次
- 资源分享 - Real-Time Rendering, Third Edition 英文原版Pdf下载 阅读4752次,点赞0次
- Python - 配置Yolov5出现ImportError: cannot import name 'PILLOW_VERSION' from 'PIL'错误 阅读1316次,点赞0次
- Python - 使用python-opencv裁剪原视频为与视频高同宽的视频 阅读1588次,点赞0次
- WordPress - 为文章增加评论才可查看相关隐藏内容的代码 阅读2670次,点赞3次
- 资源分享 - Real-Time Rendering, Second Edition 英文高清PDF下载 阅读1977次,点赞0次
- 资源分享 - Handbook of Discrete and Computational Geometry, Second Edition 英文高清PDF下载 阅读2096次,点赞0次
- 资源分享 - 解读基金:我的投资观与实践(季凯帆,康峰著)PDF下载 阅读1600次,点赞0次
- 深度学习 - 语音识别框架wenet源码wenet/utils/mask.py中的mask机制 阅读869次,点赞1次
评论
169