初步探索java中的UUID
2015-07-03 20:41
597 查看
概念
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就是“绝对”不可能重复的。(该问题回答转载自该处)
代码
java System.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个部分组成:时间戳 timestamp
时钟标识 clock ID,最初是基于随机数
结点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-0800200c9a66nodeID
node ID是 08:00:20:0c:9a:66,如果node ID已经被生成过一次,那么第一位不是08,而是09相关文章推荐
- IOS--UI--LessonCustumView 自定义视图
- android ndk-build IncrediBuild 分布式编译设置
- foundation-NSValue
- UI基础:事件.响应链
- UI基础:事件.响应链 分类: iOS学习-UI 2015-07-03 19:51 1人阅读 评论(0) 收藏
- iOS 优化UITableViewCell高度计算的那些事
- UI_UIImageView 基本操作
- 百度富文本 uEditor 调用不到,解决办法
- IOS--UI--LessontextField 文字框
- UITextField/文本输入框
- quick 截屏
- CruiseYoung提供的带有详细书签的电子书籍目录
- 使用Builder模式造车
- Android酷炫实用的开源框架(UI框架)
- UITableViewHeaderFooterView的使用+自动布局
- Android UI用户界面开发辅助工具(值得一试)
- iOS编程第四版第六章---UIViewController
- require.js 入门学习 (share)
- 关于产品设计和UI设计
- 10种不同类型的移动UI设计模式