通用唯一识别码 (英语: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> #include <boost/uuid/uuid_generators.hpp> #include <boost/uuid/uuid_io.hpp> 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" ) #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。