Java随机数和UUID#
Java随机数
在Java项目中,随机数通常通过Math.Random方法和Random类获取,前者通过生成Random类的实例来实现。
以这种方式生成的是利用线性同馀公式使用48位种子生成的伪随机数流的集合。 在Java中,随机数的生成取决于种子,随机数和种子之间的关系遵循以下两个规则:
根据种类的不同,会产生不同的随机数。
种子是相同的,即使实例不同也会产生相同的随机数。
设定种子有两种方法。
randomr=new random (长串);
或Random r=new Random (; r.setseed(1; 也就是说,种子是1。
对于一组随机数,记住生成的种子就可以了。
例如代码:
公共类客户端{
publicstaticvoidmain (字符串[ ] args ) {
randomr=newrandom(1;
for(intI=0; i 4; I ) {
系统. out.println (r.nextint (100 ); //0100
}
}
}
无论执行多少次,生成的随机数序列都必须是
85、88、47和13
Random类的默认种子(无参数结构)是System.nanoTime )的返回值。 请注意,该值是从某个时间点开始的纳秒。 固定时间点因操作系统和硬件而异。 也就是说,纳秒的值因操作系统而异,但即使是同一操作系统,纳秒的值也因时间而异,随机数当然也不同。 (顺便说一下,System.nanoTime不能用于计算日期。 这是因为“参照”的时间点不确定,纳秒的值可能为负值。 这一点与System. currentTimeMillis不同。 )
Java UUID
通用唯一标识符(uid )全局唯一标识符是指在一台计算机上生成的数字,它确保同一时间在空中的所有计算机都是唯一的。 uID是长度为16字节(128位)的id,以十六进制表示,通常表示为类似于f81 D4 FAE-7 dec-11d0- a765-00 a0c 91 e6BF 6。 算法的中心思想是将机器网卡、当地时间和随机数进行组合生成UUID。 理论上,如果一台机器每秒生成10000000个UUID,就可以保证(从概率上来说) 3240年不重复。
不需要中心认证,支持自动生成,一台机器每秒10M次(100纳秒数量级,其隐含原因可以区分的最小时间单位为100ns,以时间为因子,连续生成两个UUID的时间至少为100ns间隔易于访问、分配、排序和搜索。
代码示例:
import java.util.UUID;
公共类测试{
publicstaticvoidmain (字符串[ ] args ) {
UUID uuid=UUID.randomUUID (;
system.out.println(uuid; //生成的uuid用-分隔
String str=uuid.toString (;
string temp=str.substring (0,8 ) str.substring (9,13 ) str.substring (14,18 ) str.substring (19,23 ) str
system.out.println(temp );
}
}
UUID版本1 :基于时间的UUID
基于时间的UUID是通过计算当前时间戳、随机数和机器MAC地址获得的。 由于算法使用了MAC地址,因此此版本的UUID保证了全球范围内的唯一性。 但同时,使用MAC地址也会带来安全问题。 这就是这个版本的UUID受到批评的地方。 如果APP应用程序仅用于局域网,则还可以使用降级算法。 使用IP地址而不是MAC地址--Java的UUID经常这样实现(当然也考虑到了获取MAC的困难)。 但是,时间因素的顺序是时间下位为上位,上位为下位,所以不适合主键,COMB是可能的。
uuid版本3 :基于名称的uuid(MD5 )。
基于名称的UUID是通过计算名称和命名空间的MD5散列获得的。 此版本的UUID确保了在同一命名空间中使用不同名称生成的UUID的唯一性。 UUID在不同命名空间中的唯一性; 在相同的命名空间中重复生成相同名称的UUID是相同的。
UUID版本4 :随机UUID
基于随机数或伪随机数生成UUID。 这个UUID重复的概率可以计算,但随机的就像买彩票一样。 虽然指望发财是不可能的,但狗屎运一般都会在不经意间到来。
uuid版本5 :基于名称的uuid(sha1 ) )。
与版本3的UUID算法类似,只是使用sha1 (安全hashalgorithm1)算法计算哈希值。