创建基于时间的 UUID.pdf

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

CreatedbyYuChengHuover5yearsagoUpdatedbyHoneyMooseabout19hoursago

Visibletoarticlereaders

创建基于时间的UUID

概述

在本文中,我们将会对UUIDs和基于时间的UUIDs(time-basedUUIDs)进行一些探讨。

当我们在对基于时间的UUIDs进行选择的时候,总会遇到一些好的方面和不好的方面,如何进行选

择,也是我们将要简要探讨的内容。

同时我们还会对可能会使用类库进行一些比较和探索,以便于我们更好的做出选择。

UUIDs和基于时间的UUIDs

UUID的全称是UniversallyUniqueIdentifier,中文为通用唯一识别码。

当生成UUID的时候,系统总会自动生成一个128位的UUID。基于UUID的生产算法的不同,我们会

有不同的版本。

UUID的主要目的就是用来在全世界中唯一标识一个数据,而且需要保证生成的UUID在全世界范围内

是不重复的。因此我们可以用来标识一个上下文,包括数据库系统,计算机系统中的消息,分布式系统

中的对象等等。

为了实现这个目标,我们需要确保哪怕是在同一个时间瞬间生成的UUID也是不相同,这样能够让我们

更好的利用UUID在分布式计算机系统中标识存在的对象。

基于时间的UUID,通过字面就可以了解到,这个UUID是基于时间的,实际上这个UUID存在UUID

设计中的第一版。

这个版本是基于随机数的,使用的基数为每100纳秒为一个单位,时间的起点为1582年10月15日。同

时还需要加上当前计算机的网卡物理地址(MAC)。

在后续的版本中,UUID(v6和v7)也是基于时间的UUID生成算法,可以说是基于UUIDv1的更新

版本。

UUIDv1因为是基于时间的,所以具有排序功能,这个在对数据库的设计上就很有帮助,当我们使用

UUIDv1来作为PK(主键)的时候,我们就知道了,我们创建的这条记录的时间戳是什么时候,这个

对我们在对数据进行调试和问题分析的时候就很有帮助了。

有优势就自然会有劣势,因为我们是基于时间创建UUID的,那么在同一个系统产生UUID冲突的可能

性就会大很多,假设在同一个时间点,我们创建了很多个UUID,那么大概率就会有出现冲突,重复出

现的情况。

在本文的后部分,我们会对这个可能出现的情况进行一些探索。

另外一个原因,就是在UUIDv1版本中使用主机地址这种做法会潜在的增加系统的安全性问题。这就是

UUIDv6尝试希望解决的问题。

对比程序

为了对可能出现的UUID冲突进行演示。我们尝试使用程序来对比可能出现UUID冲突的可能性。

这个程序,将会创建128个线程,在每个线程中将会生成100,000个UUID。

首先我们对需要使用的变量来进行一些初始化:

intthreadCount=128;

intiterationCount=100_000;

MapUUID,LonguuidMap=newConcurrentHashMap();

AtomicLongcollisionCount=newAtomicLong();

longstartNanos=System.nanoTime();

CountDownLatchendLatch=newCountDownLatch(threadCount);

Java

如上面的程序所表示的内容,我们定义了128个线程,在这128个线程中,我们会循环100,000次。

同时,我们还初始化了一个ConcurentHashMap把我们生成的UUID存储到ConcurentHashMap

中。

同时,我们还会记录出现UUID冲突的次数。

为了记录程序的性能,我们对程序开始时间和程序的结束也都进行了存储。在最后我们定义了一个

latch等待所有线程的执行完成。

当定义完成后变量后,我们就需要启动线程并

文档评论(0)

iSharkFly + 关注
实名认证
内容提供者

鲨鱼君

1亿VIP精品文档

相关文档