初步探索java中的UUID

来源:互联网 发布:python 随机产生单词 编辑:程序博客网 时间:2024/06/06 19:09

概念

java中的UUID可用来生成随机数,表示128位,即16字节的值。

那么UUID会重复吗?

重复是肯定会重复的,32位的UUID,经过16^32+1次生成后,必然会产生至少一次重复,当然,不追求这个必然,偶然产生一次重复需要的平均次数比这个少得多。 不过……后面转折来了,16^32=……没算错的话有39位数啊,你每秒并发10000次(你在Google工作也不一定能遇到这种场景),3600秒×24小时×365天不断的并发,需要连续并发1000000……000000年(27个0,我不知道怎么读了),基本上宇宙毁灭之前,你也很难遇到重复的情况,SO,如果你认为纯粹靠运气连续100年每天中一次500W的事情是“绝对”不可能出现的话(这个概率比UUID重复来的还要容易些),UUID就是“绝对”不可能重复的。(该问题回答转载自该处)

代码

javaSystem.out.println("--------随机生成UUID  版本号4-------------");        UUID uuid_random = UUID.randomUUID();         System.out.println("uuid的值:     " + uuid_random + "\n");        System.out.println("取前16:   " + uuid_random.getMostSignificantBits());        System.out.println("取后16:   " + uuid_random.getLeastSignificantBits() + '\n');        System.out.println(">>UUID生成的种类:" + uuid_random.version());        System.out.println("版本号具有以下含意:");        System.out.println("     1 基于时间的 UUID  2 DCE 安全 UUID  3 基于名称的 UUID  4 随机生成的 UUID \n");        System.out.println(">>字符串去掉'-' ");        String uuid_Name = uuid_random.toString(); //如:d1ee9700-2ff7-4234-970f-6a1e0ddc44fa(32个16进位数字)        String[] uuid_Names = uuid_Name.split("-");        String uuid_Name2 = "";        for(String u : uuid_Names){            uuid_Name2 += u;        }        System.out.println("uuid的值:     " + uuid_Name2 + "\n"); //字符串去掉‘-’        System.out.println("---------------------------------------");        System.out.println("测试UUID类的timestamp方法");        UUID uuid2 = UUID.fromString("58e0a7d7-eebc-11d8-9669-0800200c9a66");        System.out.println("Time stamp value : " + uuid2.timestamp());

在以上测试代码中,UUID.fromString中的数据格式要按照8-4-4-4-12位数,并且要符合Time-based UUID的格式,否则会报错:

Time-based UUID

基于时间的UUID使用,除了版本和变体,可由3个部分组成:

  1. 时间戳 timestamp
  2. 时钟标识 clock ID,最初是基于随机数
  3. 结点ID node ID, 最好是IEEE802地址

timestap

timestap是60位值,自1582年10月15日00:00:000000000后100纳秒的间隔。
如果没有UTC时间可以获得,可以使用当前时间。必须注意的是,有些情况下时间设置未来时对应的clock ID是会增加的。
一般情况下,程序员不会获得自1582年10月15日以来100纳秒的时间间隔,却可以获取1970年1月1日以来的毫秒精度。在这种情况下,从毫秒到纳秒精度系统返回的时间乘以10000,正确的开始日期添加一个偏移量122192928000000000。

clock ID

时钟ID是一个14位值,如果一个新的时间戳比前一个时间戳更早使用(例如在一个时钟脉冲相位差错误或重启后,时间是异步的),时钟ID应该增加

node ID

结点ID会是一个IEEE 802 MAC地址又名“以太网地址”。IEEE 802地址应该是唯一的,尽管已知一些杂牌厂商会重复使用。UUID生成的地址可能来自机器的网卡,或其他可以控制或确保没有其他设备去使用的机器(或网卡)。(比如买了一张网卡,生成UUID并记录下,在一个程序中使用它后销毁这张网卡,或从IEEE 802地址购买了一系列的IEEE)。

在IEEE 802地址通常可以使用ipconfig/all或使用ifconfig eth0的命令,通常被称为“硬件”或“物理”地址检索,看起来是这样的: 08:00:20:0C:9A:66(有时也用-或空间作分隔符)

生成Time-based UUID

timestamp

当时间戳有60bit十六进制值,如1d8 eebc 58e0a7d7,
对应的UUID为:58e0a7d7-eebc-11d8-9669-0800200c9a66
以时间为基础的UUID,第三部分第1位是1

clockID

时钟标识为1669,放置在UUID的以下位置:58e0a7d7-eebc-1**1d8-9**669-0800200c9a66

nodeID

node ID是 08:00:20:0c:9a:66,如果node ID已经被生成过一次,那么第一位不是08,而是09

0 0
原创粉丝点击