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}

Boost 库uuid 的使用的更多相关文章

  1. boost库的安装,使用,介绍,库分类

    1)首先去官网下载boost源码安装包:http://www.boost.org/ 选择下载对应的boost源码包.本次下载使用的是 boost_1_60_0.tar.gz (2)解压文件:tar - ...

  2. c++ boost库学习三:实用工具

    noncopyable 大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等. 这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c= ...

  3. 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法

    1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...

  4. vs2013给项目统一配置boost库

    1.打开项目,然后点击菜单中的 视图->其他窗口->属性管理器 2. 打开属性管理器,点击项目前的箭头,展开项目,找到debug或者release下面的Microsoft.Cpp.Win3 ...

  5. [C/C++] C/C++延伸学习系列之STL及Boost库概述

    想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...

  6. dev c++ Boost库的安装

    dev c++ 的boost库的安装步骤 然后点击“check for updates”按钮 最后点击“Download selected”按钮,下载完成后安装.... 给dev添加boost库文件, ...

  7. vs配置boost库

    步骤: 1.在boost官网下载boost版本,以1.59.0为例. 2.解压,解压后可看到文件夹下有个bootstrap.bat文件. 注意: 如果有以下error: 'cl' 不是内部或外部命令, ...

  8. windows下安装boost库

    工作中现在会接触boost,所以我计划两个月之内努力熟悉一下boost.今天在自己win10系统上尝试安装了boost库,下面把遇到的问题总结一下: 1. 下好1.61版本库,在boost目录下运行b ...

  9. ubuntu 下安装boost库

    ubuntu下安装boost库,,在网上试了一些其他人推荐的libboost-dev 但是会缺少,编译程序会报错: /usr/bin/ld: cannot find -lboost_serializa ...

随机推荐

  1. 向Nexus仓库推送/使用各种组件

    1.Nuget仓库 使用NuGetPackageExplorer打包制作自己的nupkg https://github.com/NuGetPackageExplorer/NuGetPackageExp ...

  2. Hash的一点测试

    哈希表的学习与测试 以前写的hash都是碰运气的hash,就是乘上质数取模的那种,这样不能保证不碰撞,所以今天先写上几个双hush和链表的hash,并比较一下他们的速度,测试的话用洛谷上的“字符串哈希 ...

  3. webpack(2)--Entry

    Entry entry是配置模块的入口,可以抽象成输入,webpack执行构建的第一步将从入口开始搜寻及递归解析出所有入口依赖的模块. 注意: entry是必填,若不填写则将导致webpack报错退出 ...

  4. Executor框架(一)Executor框架介绍

    Executor框架简介 Executor框架的两级调度模型   在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程.Java线程启动时会创建一个本地操作系统线程:当Jav ...

  5. 5.用 CSS 创作一个立体滑动 toggle 交互控件

    原文地址:https://segmentfault.com/a/1190000014638655 HTML代码: <html> <head> <link rel=&quo ...

  6. restful 注解 总结 (比较完整的):http://www.xuetimes.com/archives/388 , https://www.cnblogs.com/chen-lhx/p/5599806.html

    参考1:  http://www.xuetimes.com/archives/388 参考2:   https://www.cnblogs.com/chen-lhx/p/5599806.html 参考 ...

  7. leetcode150

    public class Solution { public int EvalRPN(string[] tokens) { Stack<int> ST_NUM = new Stack< ...

  8. J2SE 8的Lambda --- functions

    functions //1. Runnable 输入参数:无 返回类型void new Thread(() -> System.out.println("In Java8!" ...

  9. Activity服务类-3 FormService服务类

    1.获取//通过流程定义ID获取表单字段集合StartFormData startFormData = formService.getStartFormData(processDefinitionId ...

  10. VB6 让程序结束后带有返回值

    第三方命令行程序运行完之后,批处理中可以随时通过errorlevel变量收取运行结果.而VB写的控制台程序却没有提供这样的功能.关于让控制台程序返回值的教程是本博客独家放出. 返回值,其实也就是进程的 ...