通用唯一标识码UUID的介绍及使用
什么是UUID?
UUID全称:Universally Unique Identifier,即通用唯一识别码。
UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为16^32 = 2^128,约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完。
UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字符,如:550e8400-e29b-41d4-a716-446655440000。
UUID的作用
UUID的是让分布式系统中的所有元素都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前最广泛应用的UUID,是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、Mac OS X等等。
UUID的组成
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。
UUID由以下几部分的组合:
当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。时钟序列。全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。
UUID的生成
publicstaticvoidmain(String[] args)throws Exception { System.out.println(UUID.randomUUID());}批量生成UUID网站:http://www.uuid.online/UUID的定义以及作用
UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的重要部分。
作用:
UUID 的目的是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsofts Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。
组成:
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字
UUID由以下几部分的组合:
(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
(2)时钟序列。
(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单地生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID() UDF进行转换。
应用:
使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显。根据使用的特定机制,UUID不仅需要保证是彼此不相同的,或者最少也是与公元3400年之前其他任何生成的通用唯一标识符有非常大的区别。UUID最少在3000+年内不会重复。
通用唯一标识符还可以用来指向大多数的可能的物体。微软和其他一些软件公司都倾向使用全球唯一标识符(GUID),这也是通用唯一标识符的一种类型,可用来指向组建对象模块对象和其他的软件组件。第一个通用唯一标识符是在网络计算机系统(NCS)中创建,并且随后成为开放软件基金会(OSF)的分布式计算环境(DCE)的组件。
代码:
C#
1234567891011using System;namespace Demo{ public class Test { public static void Main() { Guid guid=Guid.NewGuid(); Console.WriteLine(guid); } }}Java
1234567package com.mytest;import java.util.UUID;public class UTest { public static void main(String[] args) { UUID uuid = UUID.randomUUID(); System.out.println(uuid);}}Go
12345678import( “http://github.com/nu7hatch/gouuid” “fmt”) func main(){ fmt.Println(uuid.NewV4().String())}其他版本的介绍,组合在一起加深理解
什么是UUID?
UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。UUID具有以下涵义:
经由一定的算法机器生成为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。
非人工指定,非人工识别UUID是不能人工指定的,除非你冒着UUID重复的风险。UUID的复杂性决定了“一般人“不能直接从一个UUID知道哪个对象和它关联。
在特定的范围内重复的可能性极小UUID的生成规范定义的算法主要目的就是要保证其唯一性。但这个唯一性是有限的,只在特定的范围内才能得到保证,这和UUID的类型有关(参见UUID的版本)。
UUID是16字节128位长的数字,通常以36字节的字符串表示,示例如下:
3F2504E0-4F89-11D3-9A0C-0305E82C3301
其中的字母是16进制表示,大小写无关。
GUID(Globally Unique Identifier)是UUID的别名;但在实际应用中,GUID通常是指微软实现的UUID。
UUID的版本
UUID具有多个版本,每个版本的算法不同,应用范围也不同。
首先是一个特例--Nil UUID--通常我们不会用到它,它是由全为0的数字组成,如下:
00000000-0000-0000-0000-000000000000
UUID Version 1:基于时间的UUID
基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。
UUID Version 2:DCE安全的UUID
DCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。
UUID Version 3:基于名字的UUID(MD5)
基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。
UUID Version 4:随机UUID
根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。
UUID Version 5:基于名字的UUID(SHA1)
和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。
UUID的应用
从UUID的不同版本可以看出,Version 1/2适合应用于分布式计算环境下,具有高度的唯一性;Version 3/5适合于一定范围内名字唯一,且需要或可能会重复生成UUID的环境下;至于Version 4,我个人的建议是最好不用(虽然它是最简单最方便的)。
通常我们建议使用UUID来标识对象或持久化数据,但以下情况最好不使用UUID:
映射类型的对象。比如只有代码及名称的代码表。人工维护的非系统生成对象。比如系统中的部分基础数据。对于具有名称不可重复的自然特性的对象,最好使用Version 3/5的UUID。比如系统中的用户。如果用户的UUID是Version 1的,如果你不小心删除了再重建用户,你会发现人还是那个人,用户已经不是那个用户了。(虽然标记为删除状态也是一种解决方案,但会带来实现上的复杂性。)
UUID生成器
我没想着有人看完了这篇文章就去自己实现一个UUID生成器,所以前面的内容并不涉及算法的细节。下面是一些可用的Java UUID生成器:
Java UUID Generator (JUG):开源UUID生成器,LGPL协议,支持MAC地址。UUID:特殊的License,有源码。Java 5以上版本中自带的UUID生成器:好像只能生成Version 3/4的UUID。
此外,Hibernate中也有一个UUID生成器,但是,生成的不是任何一个(规范)版本的UUID,强烈不建议使用。
【References】
[1] 百度百科(http://baike.baidu.com/item/UUID)
[2] http://www.blogjava.net/feelyou/archive/2008/10/14/234320.htmlBLE设备之间的交互过程
本文的目标 :
了解BLE之间设备是如何工作的,有哪些主要流程,为后续深入BLE协议分析做准备。现在以HRS(Heart Rate Sensor)为例来说明。硬件:Heart Rate Sensor,手机
Heart Rate Sensor:负责检测心率等信息; 手机:同HRS通过BLE通信,搜集并展现出心率等信息二者对应关系如下:

从协议的角度讲,Heart Rate Sensor必须提供两种服务(蓝牙规范所定义):
Heart Rate Service:提供心率等服务,Device Information Service提供设备信息服务。
连接图:

手机就是充当Collector的角色;为了了解手机与HRS之间的交互流程,先来看手机端的操作:




手机操作经过三步:
搜索发现设备 My BLE,其蓝牙地址是01:88:BE:51:41:44,此时手机只知道周围有一个BLE设备;连接该设备,并搜索发现设备提供的服务,发现其提供两个服务:Heart Rate Service和Device Information Service查看Heart Rate Service提供的服务和操作方法,可以看到,提供SensorLocation,HeartRate测量以及EnergyExpended功能,并且有一个STAR TNOTIFY开关。打开开关就能收到HeartRate Sensor通知的心率值,图中的70bpm
这个过程如下:
Heart Rate Sensor对外广播,手机扫描搜索周围设备,并在收到Heart Rate Sensor的广播数据后发起连接,连接成功后搜索其提供的服务,并发现HeartRate Sensor服务的特性和操作方法,进而获取心率监测。
大致过程如下:
以下是整个过程对应的数据包,从中也可以印证:
广播与连接:2. 链路控制,例如更新链路参数
3. 发现服务(service),发现服务是一个过程,可能通过多次交互才能完成
4. 发现服务的特性(characteristics),发现特性也是一个过程,可能通过多次交互才能完成
5. 操作服务,这里包括手机读或者写Heartrate sesnsor提供的服务特性,Heart rate sesnsor的主动通知(Notify)方法:
6. 断开连接
以上这个过程是一个典型的BLE设备之间的交互过程。几个阶段说明如下:(a)广播与扫描:
一个设备要让其他设备能发现,则必须向外广播,而一个设备如果对广播者感兴趣,想进一步了解,则可以通过扫描该设备来进一步获取该设备提供的信息,通过这个阶段,扫描的设备已经基本清楚了广播设备信息,以及提供的能力,从而可以判断是否连接该设备。
(b)建立连接:当扫描者想与广播者可以建立连接,那么设备之间就会有一个建立连接请求。
1) 在建立连接后,如果设备之间要设置一些连接信息或者获取版本信息等等,这可以提供链路层定义的数据格式来发送数据实现,例如master更改连接参数,slave发起更新连接参数请求等等
2) 为了无线安全,例如数据加密,对数据完整性验证,以及数据在传送过程中有没有被修改等,设备之间可以发起配对流程,该过程是可选实现的。
3) 建立连接请求后,为了能获取设备提供的服务,让客户端能操作设备,那么就需要经历一个设备服务发现过程,只有在这一步后,才能知道设备提供服务的具体操作方法以及操作handle。
4) 知道了设备的具体操作方法,就可以操作设备
5) 最后,设备任意一方可以发起断开连接请求。
整个流程包括了广播通道上的PDU(广播和连接请求),以及数据通道上的PDU (L2CAP,ATT/GATT),后面具体章节将根据PDU类型来分析具体流程。
免责声明:文章内容来自互联网,版权归原作者所有,本站仅提供信息存储空间服务,真实性请自行鉴别,本站不承担任何责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:小科普:通用唯一标识码UUID的介绍及使用 https://www.7ca.cn/zsbk/zt/23120.html