UUID 入门

通用唯一识别码(英语:Universally Unique Identifier,简称 UUID)的标准型式包含 32 个 16 进制数字,以连字号分为五段,形式为 8-4-4-4-12 的 32 个字符。示例:

550e8400-e29b-41d4-a716-446655440000

接下来重点描述在开发中的使用及应用。

在 C++ 中的使用

C++ 原生(C++03、C++11/0x)并不支持 UUID。所以要想在 C++ 代码中生成 UUID,如果要求跨平台推荐使用第三方库 Boost UUID,要么结合各自的平台,使用系统 API。以下方法整理自互联网,除 Boost Uuid 和 libuuid 使用过之外,其他的未亲自试验。

UUID generation using Boost in C++

在 StackOverflow 上的一个例子:跳转链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

#include <boost/uuid/uuid.hpp> // uuid class
#include <boost/uuid/uuid_generators.hpp> // generators
#include <boost/uuid/uuid_io.hpp> // streaming operators etc.

int main()
{
boost::uuids::random_generator generator;

boost::uuids::uuid uuid1 = generator();
std::cout << uuid1 << std::endl;
boost::uuids::uuid uuid2 = generator();
std::cout << uuid2 << std::endl;

return 0;
}

如果以上例子满足不了你的需求,需要在更复杂的情景下使用,请移步 Boost Uuid 官方文档

Qt QUuid

参考来源

Qt 是一个跨平台的 C++ 编程框架,QUuid 类实现了 UUID 的生成、比较、转换等功能。

函数 QUuid createUuid(),可用于生成 UUID。示例如下:

1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <QUuid>
#include <QString>

int main()
{
QUuid uuid = QUuid::createUuid();
std::cout << qPrintable(uuid.toString()) << std::endl;
return 0;
}

Linux 下生成 UUID

Shell

Unix/Linux 环境中大都有一个名为 uuidgen 的小工具,运行即可生成一个 UUID 到标准输出。读取文件 /proc/sys/kernel/random/uuid 即得UUID,例如:

cat /proc/sys/kernel/random/uuid

libuuid

参考来源

libuuid 是一个用于生成 UUID 的 C 库,具体用法参考 http://linux.die.net/man/3/libuuid,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <uuid/uuid.h>

int main(int argc, char **argv)
{
uuid_t uuid;
char str[36];

uuid_generate(uuid);
uuid_unparse(uuid, str);

printf("%s\n", str);

return 0;
}

在 Linux 下编译时需要链接 uuid 库

gcc -o uuid uuid.c -luuid

问题: 在什么系统下自带?在什么系统中需要另行安装?

在 Ubuntu 中,可以用下面的命令安装 libuuid:

sudo apt-get install uuid-dev

Windows 下生成 UUID

CoCreateGuid

参考来源

Windows 下提供了函数 CoCreateGuid 用于生成 GUID。需要使用的头文件是 #include <objbase.h>,需要链接的库是 ole32.lib,函数原型为:HRESULT CoCreateGuid(GUID *pguid); ,GUID 的原型为

1
2
3
4
5
6
7
typedef struct _GUID
{
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;

UuidCreate

参考来源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma comment(lib, "rpcrt4.lib")  // UuidCreate - Minimum supported OS Win 2000
#include <windows.h>
#include <iostream>

using namespace std;

int main()
{
UUID uuid;
UuidCreate(&uuid);
char *str;
UuidToStringA(&uuid, (RPC_CSTR*)&str);
cout<<str<<endl;
RpcStringFreeA((RPC_CSTR*)&str);
return 0;
}

在 Java 中使用

工作中偶尔会写一些 Java 的项目,所以也捎带整理一下。

在 MySQL 中

MySQL 本身是带有生成 uuid 功能的。也就是我们惯用的整数递增作为主键,其实是可以用 uuid 替代的。可以在一条记录插入之前写触发器,调用 UUID() 函数生成 uuid。