UUID 簡介
通用唯一識別碼(英語:Universally Unique Identifier,簡稱UUID)是一種軟件建構的標准,亦為開放軟件基金會組織在分布式計算環境領域的一部分。
uuid 版本
先看幾個例子
Nil/Empty: 00000000-0000-0000-0000-000000000000
UUID v1 : 16824f40-aec1-11e8-a69c-f7a44da04f19
UUID v4 : be1f4811-fd38-4bde-933a-1314dea3e436
UUID v5 : c296b0ad-4d8d-5878-97f6-ae9430684dff
UUID 的第三段的第一個字符,表示UUID的版本號,到目前,有5個版本。
- UUID_v1 : 使用MAC 地址和戳來生成,在過去,唯一性非常好,但是會暴露生成者的主機信息,據說歷史上有因UUID v1的使用導致生成者被攻擊的。在服務器網卡MAC基本都是隨機出來的今天,比較少見了。
- UUID_v2 : 類似 v1, 增加了 DEC security, 因為這個版本沒有提供任何實現細節,所以很多的實現都是實現了自己的 v2 版uuid。
- UUID_v3&v5: 這兩個版本都是使用一個指定的UUID作為命名空間,然后對一個給定的Name進行Hash 之后生成 UUID, 相同命名空間和相同名稱生成出來的UUID是相同的,v3和v5 的區別是, v3 使用MD5 ,而v5 使用 sha1。
- UUID_v4 :這個版本就是使用隨機數生成UUID。一般算法都是使用隨機數填充整個UUID,然后修改版本位及其它的幾個位。
boost 庫實現了 UUID 的v4 和 v5.
頭文件
使用boost庫的uuid,一般需要三個頭文件
頭文件 <boost/uuid/uuid.hpp>
定義了 UUID 的類型
頭文件 <boost/uuid/uuid_generators.hpp>
實現了幾種UUID的生成算法
頭文件 <boost/uuid/uuid_io.hpp>
實現了UUID 類型的流操作
示例
源代碼:
#include <iostream>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <array>
#include <sstream>
#include <string>
#include <random>
namespace uuids = ::boost::uuids;
void compare(const uuids::uuid &l, const uuids::uuid& r) {
std::ostringstream ss;
ss << "{" << l << "}";
if (l > r) {
ss << " > ";
} else if (l == r) {
ss << " = ";
} else {
ss << " < ";
}
ss << "{"<< r << "}"<< std::endl;
std::cout << ss.str();
}
void split_line() {
std::cout << "-------------------------------------------------------------------" << std::endl;
}
int main()
{
std::array<uuids::uuid, 5> ids;
uuids::random_generator uuid_v4;
uuids::random_generator uuid_v4_2;
std::cout << "generate uuid with random_generator(uuid version 4)" << std::endl;
split_line();
for (size_t i = 0; i < ids.size(); ++i) {
if (i % 2 == 0)
ids[i] = uuid_v4();
else
ids[i] = uuid_v4_2();
std::cout << ids[i] << std::endl;
}
std::cout << std::endl;
// convert uuid to string
std::string id_s = uuids::to_string(ids[0]);
std::cout << "uuid compare" << std::endl;
split_line();
for (size_t i = 0; i + 1 < ids.size(); ++i) {
compare(ids.at(i), ids.at(i + 1));
}
compare(ids.at(0), ids.at(0));
std::cout << std::endl;
std::cout << "generate uuid with name_generator(uuid version 5)" << std::endl;
split_line();
uuids::name_generator uuid_v5(uuids::string_generator()("{1E7F9D92-8499-44F9-9958-20445DDBBCDB}"));
auto id = uuid_v5("abcdef");
std::cout << id << std::endl;
id = uuid_v5("abcdef");
std::cout << id << std::endl;
std::cout << std::endl;
std::cout << "generate uuid with nil_generator(empty uuid)" << std::endl;
split_line();
id = uuids::nil_generator()();
std::cout << id << std::endl;
std::cout << std::endl;
std::cout << "generate uuid with string_generator(parse from string)" << std::endl;
split_line();
std::array<std::string, 8> inputs{ "abcdef1234567890abcdef1234567890",
"{abcdef1234567890abcdef1234567890}",
"abcdef12-3456-7890-abcd-ef1234567890",
"{abcdef12-3456-7890-abcd-ef1234567890}",
"[abcdef12-3456-7890-abcd-ef1234567890]",
"[abcdef1234567890abcdef1234567890]",
"helloworldaaaaaaaaaaaaaaaaaaaaaaaaaa",
"nothingbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"};
for (auto input : inputs) {
auto id = uuids::string_generator()(input);
std::cout << input << ":\t{" << id << "}" << std::endl;
}
}
輸出:
generate uuid with random_generator(uuid version 4)
-------------------------------------------------------------------
0727e06d-0ec3-4ade-bb98-e84d0376e158
e8549db9-a364-4575-ba9f-fc3122df8d55
5d96dc8a-4bbc-4c1b-a17b-3ef99a023192
56497310-7abc-43a9-b406-0affe1df1d96
80d6bd27-51eb-4581-b68c-b12574fbbe1f
uuid compare
-------------------------------------------------------------------
{0727e06d-0ec3-4ade-bb98-e84d0376e158} < {e8549db9-a364-4575-ba9f-fc3122df8d55}
{e8549db9-a364-4575-ba9f-fc3122df8d55} > {5d96dc8a-4bbc-4c1b-a17b-3ef99a023192}
{5d96dc8a-4bbc-4c1b-a17b-3ef99a023192} > {56497310-7abc-43a9-b406-0affe1df1d96}
{56497310-7abc-43a9-b406-0affe1df1d96} < {80d6bd27-51eb-4581-b68c-b12574fbbe1f}
{0727e06d-0ec3-4ade-bb98-e84d0376e158} = {0727e06d-0ec3-4ade-bb98-e84d0376e158}
generate uuid with name_generator(uuid version 5)
-------------------------------------------------------------------
7367fb7c-1fff-573f-853d-49db6bca0ac7
7367fb7c-1fff-573f-853d-49db6bca0ac7
generate uuid with nil_generator(empty uuid)
-------------------------------------------------------------------
00000000-0000-0000-0000-000000000000
generate uuid with string_generator(parse from string)
-------------------------------------------------------------------
abcdef1234567890abcdef1234567890: {abcdef12-3456-7890-abcd-ef1234567890}
{abcdef1234567890abcdef1234567890}: {abcdef12-3456-7890-abcd-ef1234567890}
abcdef12-3456-7890-abcd-ef1234567890: {abcdef12-3456-7890-abcd-ef1234567890}
{abcdef12-3456-7890-abcd-ef1234567890}: {abcdef12-3456-7890-abcd-ef1234567890}
[abcdef12-3456-7890-abcd-ef1234567890]: {fabcdef1-ff34-56f7-89ff-abcdfef12345}
[abcdef1234567890abcdef1234567890]: {fabcdef1-2345-6789-0abc-def123456789}
helloworldaaaaaaaaaaaaaaaaaaaaaaaaaa: {feffffff-fdaa-aaaa-aaaa-aaaaaaaaaaaa}
nothingbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: {fffffffb-bbbb-bbbb-bbbb-bbbbbbbbbbbb}