标识符(UUID)是开放软件基金会(OSF)制定的标准,其意图在于分布式软件系统中生成唯一的标识,而这个标识无需统一的协调中心来进行分配. 任何人都可以创建UUID来标识某样事物,并且有足够的信心来保证所生成的标识是唯一的,也就是说别人不会使用到你所生成的标识符. 关于UUID这个标准使用最普遍的是微软对其的实现-GUID(Globals Unique Identifiers).
UUID是由一个十六位的数字组成,表现出来的形式例如
550E8400-E29B-11D4-A716-446655440000
那么我们怎么来生成这个唯一的标识呢?
为此J2SE5.0新增加了一个类java.util.UUID,借助它可以生成唯一的标识符.请看下面一段代码
public static void main(String[] args) {
  UUID uuid = UUID.randomUUID();
  System.out.println(uuid.toString());
}
执行一下这段代码,结果有如 702b0031-d99c-477b-97fa-6cfd158901d6 . 每次执行的结果都不一样.
UUID跟随机数有什么区别呢?
前面提到了,UUID适合分布式的软件系统中. UUID用于保证每个节点所生成的标识都不会重复(或者说重复的概念极低,至于有多低我也不知道怎么形容),而随机数顶多保证在同一个节点(进程)中能保证生成的数字唯一,而多个进行同时生成的随机数相同的概率非常高,因此随机数并不适用于分布式系统中.
现实中那些东西用到了UUID?
最常见的就是微软的ActiveX对象,COM对象了.例如在web页面中使用的Flash播放插件就会出现这样的代码 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 而clsid后面这个数字串就是微软开发工具生成的用于Flash播放器这个对象的唯一标识,它的格式完全与我们前面自生成的标识一致.
参考资料
更多关于生成UUID的算法请看因特网草案 UUIDs and GUIDs , 关于标准的定义请见 ISO/IEC 11578:1996 .