Java的UUID生成工具并发测试

简介:
+关注继续查看
一、认识UUID
 
UUID 
维基百科,自由的百科全书

通用唯一识别码 (Universally Unique Identifier, UUID) 是一个软件建构的标准,亦为自由软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。 

UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 文件系统、LUKS 加密分区区、GNOME、KDE、Mac OS X 等等。另外我们也可以在 e2fsprogs 包中的 UUID 库找到实现。 

[编辑] 定义 
一组 UUID,系由一串 16 字节(亦称 16 字节,或 128 位)的16进位数字所构成,是故UUID理论上的总数为216 x 8=2128,约等于3.4 x 1038。也就是说若每奈秒产生1兆个UUID,要花100亿年才会将所有UUID用完。 

UUID的标准类型包含32个16进位数字,以连字号分为五段,形式为8-4-4-4-12的32个字符。示例; 

550e8400-e29b-41d4-a716-446655440000    
UUID亦可刻意重复以表示同类。例如说微软的COM中,所有组件皆必须实现出IUnknown接口,方法是产生一个代表IUnknown的UUID。无论是程序试图访问组件中的IUnknown接口,或是实现IUnknown接口的组件,只要IUnknown一被使用,皆会被参考至同一个ID:00000000-0000-0000-C000-000000000046。 

[编辑] 随机UUID的重复机率 
随机产生的UUID(例如说由java.util.UUID类产生的)的128个位中,有122个位是随机产生,4个位在此版本('Randomly generated UUID')被使用,还有2个在其变体('Leach-Salz')中被使用。利用生日悖论,可计算出两笔UUID拥有相同值的机率约为 

    
以下是以x=2122计算出n笔UUID后产生碰撞的机率: 

n 机率    
68,719,476,736 = 236 0.0000000000000004 (4 x 10-16)    
2,199,023,255,552 = 241 0.0000000000004 (4 x 10-13)    
70,368,744,177,664 = 246 0.0000000004 (4 x 10-10)    

与被陨石击中的机率比较的话,已知一个人每年被陨石击中的机率估计为170亿分之1[1],也就是说机率大约是0.00000000006 (6 x 10-11),等同于在一年内置立数十兆笔UUID并发生一次重复。换句话说,每秒产生10亿笔UUID,100年后只产生一次重复的机率是50%。如果地球上每个人都各有6亿笔UUID,发生一次重复的机率是50%。 

产生重复UUID并造成错误的情况非常低,是故大可不必考虑此问题。 

机率也与乱数产生器的品质有关。若要避免重复机率提高,必须要使用奠基于密码学上的假乱数产生器来生成值才行。 
 
二、Java5的UUID
在Java5以后,UUID的生成成了小菜一碟的小事,直接生成即可。对此需要了解:
有 4 种不同的基本 UUID 类型:基于时间的 UUID、DCE 安全 UUID、基于名称的 UUID 和随机生成的 UUID。 这些类型的 version 值分别为 1、2、3 和 4。具体什么含义,看看JDK文档即可。
 
这里,主要想通过多线程生成UUID测试下,看看是否会重复,效率如何:
import java.util.UUID; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

/** 
* Java的UUID生成工具并发测试 

* @author leizhimin 2010-7-10 16:25:13 
*/
 
public class TestUUID implements Runnable { 
        public static void main(String[] args) { 
                ExecutorService pool = Executors.newFixedThreadPool(5); 
                for (int i = 0; i < 8; i++) { 
                        pool.execute(new TestUUID()); 
                } 
                pool.shutdown(); 
        } 

        public static String genReqID() { 
//                return UUID.randomUUID().toString().replace("-", "").toUpperCase(); 
                return UUID.randomUUID().toString().toUpperCase(); 
        } 

        public void run() { 
                for (int i = 0; i < 10; i++) { 
                        System.out.println(genReqID()); 
                } 
        } 
}
 
20F644DE-23C5-4E04-BE38-991710D2DA13 
93349C44-D8BA-495E-A687-44AE3FAEA9A5 
BEB86A25-A9E5-47DC-BC22-157E021EAD3C 
C990218F-C925-4A41-8006-D4489145CED6 
767CD9B4-4E6A-4D53-BE96-CF35E6F69D60 
A3876D8D-E807-492E-9054-28B9289EB5C5 
17DD2BCD-E710-4F7A-B8F3-6BB19201E15B 
901CCE61-4E47-4B2B-AA06-22A023D78313 
81473B2F-FBC1-4D3D-834E-DEFFBD3C510C 
46980DBD-E6A0-46E6-8FE9-E2E5766C2442 
0BF83A5F-7A31-44C2-AE7F-EB4281F9CDE0 
E35383D0-4850-45A1-B764-F8760BF1707B 
772A2E21-ABAF-47AE-978C-AF70F40313F1 
0DB815CF-C7B5-4E2F-B2DB-E84BC7B616F8 
C826D9B7-E1F3-4F8E-8AAF-A61197AAFCCF 
26CF2391-7C01-43FE-B515-5BD5DA6AF0B3 
2544396E-D9C3-4D4D-B2CB-2A77107D4167 
5BED5394-59DA-4E45-8182-34A24E1D2AC2 
F32F5F1E-6C6F-4C9F-9944-6CE4EC8768F7 
775F0B36-0965-4BA8-B1AA-FD1CFBE2B718 
32DA0548-B562-444D-A16A-7E535EAA3C93 
C935101E-7365-45C5-BBD1-3A64F2EC33C2 
E623EC45-1F7E-4973-8132-424C134C7096 
86AFEE47-AFD7-4479-B30D-0C2632087404 
847F46FA-D112-4CB7-86E4-640F03A1E676 
FA45ADA6-6A63-4961-B7C5-9501B21E116A 
3E21CBC8-C116-437A-BAEC-4AD02F711F02 
6025C077-379D-4458-BBEB-66D47FCF2206 
09F7872D-90EE-4151-9463-1609200CE615 
5FB07DF6-BA89-4017-BE9D-592DB6EADF05 
6D7627AD-347C-4E69-B0A7-3674CCBDEE79 
1E4E5E7D-AE3F-419F-836E-F284842261A6 
1FFD670E-EC2C-462A-8E82-DACC21CF153A 
FB5868EE-5330-4F6D-8CEE-0B1A50156E26 
A38918F7-FB35-4560-9810-BE0B649E8D20 
009508E8-0C9B-4189-BB5F-159F7EB2AAB6 
30132165-0207-40B0-943F-E34B401D724F 
CA5D15A0-490B-47D7-BF2A-9D58F8742E5B 
BCE31255-156D-479E-B4EC-949A731B3FF2 
A6CC370E-AFE0-439A-AFF3-37A76687B259 
27894607-1CEF-43C2-93FC-75B59CB617A9 
39ABD92B-D4CE-4B3C-BB70-D94739849DA2 
04D2E913-75C2-4506-8ED7-5A95F023DCFD 
FE853E35-72C6-422C-A7C4-CC4C0A4C9A98 
7A6D6722-BC13-4965-95D4-F35B428E297D 
92A4831A-A60E-4C16-AD8F-C8AC839436FF 
9B58249F-3F6F-4434-ACF6-00F51A971243 
7DDB1ABC-7918-4465-B8E3-0CB59D63F979 
EF43F137-63D1-4361-BFB6-4A5C51B86C12 
B785B7FE-FBA4-49B1-ADF8-CFD6107D9DB6 
68EA68F7-A56B-4DDA-A832-BCD59BF67BA1 
09F7E3E5-4344-49F7-992B-0E0B33D11296 
78EEBA04-C836-44ED-829F-6F55E3E758A4 
A4333A46-482B-47BE-87D0-BC0666EAE8FC 
38E1212E-3D11-4275-A50C-42D98CEF91C5 
FD9EDACF-6345-435E-B8A2-D8CDA8A66EE0 
24925FA8-BB81-4639-BFFA-A12CA99E419F 
B6994147-4AC2-414C-9669-9DC3E4BE8F88 
1938E265-B213-46AC-A349-678B7E029771 
485757B6-7C6E-4CFF-959B-6DF94DC282B6 
C43E385D-B798-4FE0-8F50-2DCC8370655E 
19426A29-E2C9-4DAF-A5EE-48131D719D66 
8773F8F0-45C5-463B-85EB-97E8395CBB81 
2B5F6CB2-E1F2-44A8-A60E-C8CD4191EE52 
65775AF5-34C6-491A-8DED-A257E2480C62 
A6F23801-B2E2-40A4-9415-43797BF14DD8 
D1E386E3-6BBF-40E0-BF84-E0C41F32B6E7 
97A836A3-64F9-4FDA-AD78-238CF1B8F413 
32CE9D3D-EDA1-4E8C-87B9-DBAAD389FBAA 
F2467331-CC34-49C1-9A3B-7566AE525B3B 
847C08A3-D8AE-4C66-84F7-28387AD84EA9 
5E8A99E6-600E-4797-B590-72345106E295 
6B576614-4F9D-4018-98A8-ECCFDEA045B0 
27070E60-ACE5-474D-AA47-8A4F37D16742 
18BB8499-7836-4ACC-A301-167D52AB3D3F 
8EC342B2-555A-4EAC-A82D-5AC6C7941421 
5BF92378-7EFD-4454-806C-DFBFE51753C3 
1A5B0717-07C0-46EA-8F3D-6246C57D9FB1 
C3C642CE-A05E-496D-85E6-4830CF39970B 
74B751BF-5CA5-4526-AFB8-2AA467852976 

Process finished with exit code 0
 
 本来UUID是小写的,我改为大写的了。可以发现一个规律,UUID码是长度相同的,36位字符,如果去掉连接线,正好是32位的。其实完全可以去掉连接线,因为连接线的位置是相同的。
去掉的方法很简单:
return UUID.randomUUID().toString().replace("-", "").toUpperCase();


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/347354,如需转载请自行联系原作者
相关文章
|
1天前
|
安全 算法 Java
Java处理并发编程工具集合(JUC)详解2
Java处理并发编程工具集合(JUC)详解2
493 0
|
1天前
|
Java 调度 开发工具
Java处理并发编程工具集合(JUC)详解 1
Java处理并发编程工具集合(JUC)详解
373 0
|
8天前
|
Java 开发工具 Android开发
java代码混淆工具Allatori
java代码混淆工具Allatori
28 0
|
11天前
|
IDE Java 数据库
Java实体映射工具MapStruct
Java实体映射工具MapStruct
13 0
|
22天前
|
存储 监控 算法
Java内存分析相关工具
Java内存分析相关工具
25 0
|
1月前
|
Arthas 监控 Java
开源Java诊断工具Arthas:开篇之watch实战
还在为排查Java程序线上问题头痛吗,看我们用阿里开源的诊断神器 Arthas 来帮您
108 1
|
1月前
|
XML 存储 Java
[Java Web]Maven:一个管理和构建Java项目的工具(二)
[Java Web]Maven:一个管理和构建Java项目的工具(二)
|
1月前
|
存储 druid IDE
[Java Web]Maven:一个管理和构建Java项目的工具(一)
[Java Web]Maven:一个管理和构建Java项目的工具
|
1月前
|
开发框架 JavaScript 前端开发
HarmonyOS学习路之开发篇—Java UI框架(使用工具自动生成JS FA调用PA代码)
JS FA(Feature Ability)调用PA (Particle Ability)是使用基于JS扩展的类Web开发范式的方舟开发框架所提供的一种跨语言能力调用的机制,用于建立JS能力与Java能力之间传递方法调用、处理数据返回以及订阅事件上报的通道。开发者可以使用FA调用PA机制进行应用开发,但直接使用该机制需要开发者手动撰写大量模板代码,且模板代码可能与业务代码相互耦合,使得代码可维护性和可读性较差。
|
1月前
|
Java
java日期小工具工具
java日期小工具工具
27 0
相关产品
云迁移中心
推荐文章
更多