UUID(Universally Unique Identifier)全局惟一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的全部机器都是惟一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。算法
由如下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,若是你在生成一个UUID以后,过几秒又生成一个UUID,则第一个部分不一样,其他相同),时钟序列,全局惟一的IEEE机器识别号(若是有网卡,从网卡得到,没有网卡以其余方式得到),UUID的惟一缺陷在于生成的结果串会比较长。安全
为了保证UUID的惟一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其惟一性的同时,意味着只能由计算机生成。分布式
UUID是不能人工指定的,除非你冒着UUID重复的风险。UUID的复杂性决定了“通常人“不能直接从一个UUID知道哪一个对象和它关联。ui
UUID的生成规范定义的算法主要目的就是要保证其惟一性。但这个惟一性是有限的,只在特定的范围内才能获得保证,这和UUID的类型有关(参见UUID的版本)。spa
UUID具备多个版本,每一个版本的算法不一样,应用范围也不一样。
首先是一个特例--Nil UUID--一般咱们不会用到它,它是由全为0的数字组成,以下:
00000000-0000-0000-0000-000000000000对象
基于时间的UUID经过计算当前时间戳、随机数和机器MAC地址获得。因为在算法中使用了MAC地址,这个版本的UUID能够保证在全球范围的惟一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。若是应用只是在局域网中使用,也可使用退化的算法,以IP地址来代替MAC地址--Java的UUID每每是这样实现的(固然也考虑了获取MAC的难度)。md5
分布式计算环境(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。it
基于名字的UUID经过计算名字和名字空间的MD5散列值获得。这个版本的UUID保证了:相同名字空间中不一样名字生成的UUID的惟一性;不一样名字空间中的UUID的惟一性;相同名字空间中相同名字的UUID重复生成是相同的。io
根据随机数,或者伪随机数生成UUID。这种UUID产生重复的几率是能够计算出来的,但随机的东西就像是买彩票:你期望它发财是不可能的,但狗屎运一般会在不经意中到来。后台
和版本3的UUID算法相似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。
因为整个DDpush是基于UUID来工做的,DDpush认为一个UUID能惟一标识一个终端,无论其来源和任何特性。UUID是保持和识别在线终端的惟一方式,是推送的核心支撑,据了解,在具体项目中,UUID的生成后台是基于版本4(伪随机数生成UUID)的,每一个devicesId同时对应一个UUID。