UUID:
UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。
UUID是16字节128位长的数字,通常以36字节的字符串表示,其中的字母是16进制表示,大小写无关。
示例如下:
5b1011d0-bbd3-4c99-a54b-d70184619021
GUID(Globally Unique Identifier)是UUID的别名,但在实际应用中,GUID通常是指微软实现的UUID。
UUID特点:
1.经由一定的算法机器生成
为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。
2.非人工指定,非人工识别
UUID是不能人工指定的,除非你冒着UUID重复的风险。UUID的复杂性决定了”一般人“不能直接从一个UUID知道哪个对象和它关联。
3.在特定的范围内重复的可能性极小
UUID的生成规范定义的算法主要目的就是要保证其唯一性。但这个唯一性是有限的,只在特定的范围内才能得到保证,这和UUID的类型有关(参见UUID的版本)。
关于:获得JavaUUID.randomUUID冲突的几率
根据维基百科,关于随机UUID中重复概率描述:
仅在未来100年内每秒产生10亿个UUID之后,仅创建一个副本的概率将约为50%。或者换一种说法,如果地球上每个人拥有6亿UUID,那么一个副本的概率大约是50%。
也就是说,每秒产生10亿UUID,100年中只产生一次重复的机率是50%。同样的推理适用于Java的UUID实现,所以不必担心这个。
UUID作用:
UUID 的目的是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,所有元素都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。
目前最广泛应用的UUID,即是微软的 Microsoft’s Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。
UUID组成:
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字:
1.当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
2.时钟序列。
3.全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(8-4-4-4-12),其中每个x是0-9或 a-f范围内的一个十六进制的数字。
UUID生成网站:
UUID Online
.
Online UUID Generator
.
UUID在线生成
.
Java获取UUID:
import java.util.UUID;
public class Test {
public static void main(String[] args) {
//生成随机UID
String str1 = UUID.randomUUID().toString();
System.out.println(str1);
//根据指定字节数组生成uuid,生成的uuid与字节数组的值有关
String str2 = UUID.nameUUIDFromBytes("123".getBytes()).toString();
System.out.println(str2);
//根据指定字符串生成uuid,生成的uuid与字符串的值有关
//字符串必须由由"-"分割的5部分组成,自动在位数不足的部分前补足0
String str3 = UUID.fromString("b11d0-d3-49-4b-d7461").toString();
System.out.println(str3);
//获取没有"-"的UUID字符串
String str4 = UUID.randomUUID().toString().replaceAll("-","");
System.out.println(str4);
}
}