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. Spring bean注解配置(1)

    Spring自带的@Component注解及扩展@Repository.@Service.@Controller,如图 在使用注解方式配置bean时,需要引进一个包: 使用方法: 1.为需要使用注解方 ...

  2. Java与C++语法的区别

    1. 注释可以在Java程序中起到文档标记的作用 类文档标记: 1)@version 2)@author 3)@param 4)@return 5)@exception 2. Java的字符占两个字节 ...

  3. Hive基础之Hive的复杂类型

    ARRAY 一组有序字段,字段的类型必须相同.Array(1,2) create table hive_array(ip string, uid array<string>) row fo ...

  4. 使用php的mysqli扩展库操作mysql数据库

    简单介绍mysqli: 1.mysqli(mysql improve mysql扩展库的增强版) mysql扩展库和mysqli扩展库的区别 1.mysqli的稳定性  安全性 和 执行效率有所提高 ...

  5. Mysql主从同步在线实施步骤【适合大数据库从库配置】

    Mysql主从同步在线实施步骤[适合大数据库从库配置] MySQL的主从搭建大家有很多种方式,传统的mysqldump方式是很多人的选择之一,但比较适合在新实例中实施,对于较大的数据库则存在停机等不可 ...

  6. DOS 批处理命令For循环命令详解

    for命令是一种对一系列对象依次循环执行同一个或多个命令的在命令行或批处理中运行的命令,结合一些Windows管理中的程序后,其处理功能强大.应用灵活方便程度令人刮目相看   for命令是一种对一系列 ...

  7. Executor框架(七)Future 接口、FutureTask类

    Future接口介绍   Future 表示异步计算的结果.它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果.   Future 一般由 ExecutorService 的submi ...

  8. 可视化学习Tensorboard

    可视化学习Tensorboard TensorBoard 涉及到的运算,通常是在训练庞大的深度神经网络中出现的复杂而又难以理解的运算.为了更方便 TensorFlow 程序的理解.调试与优化,发布了一 ...

  9. Configure First SpringMVC project in IntelliJ IDEA(fail)

    Configure First SpringMVC project in IntelliJ IDEA 13 The Mechanism of Spring MVC frameworks by Java ...

  10. Table-Driven Design 表驱动设计

    注:本文所有代码来自 http://www.codeproject.com/Articles/42732/Table-driven-Approach 在许多程序中,经常需要处理那些拥有种种色色不同特性 ...