Java随机数和UUID
Java随机数和UUID
#
Java随机数
在Java项⽬中通常是通过Math.random⽅法和Random类来获得随机数,前者通过⽣成⼀个Random类的实例来实现。
此类产⽣的是⼀组伪随机数流,通过使⽤ 48 位的种⼦,利⽤线性同余公式产⽣。在Java中,随机数的产⽣取决于种⼦,随机数和种⼦之间的关系遵从以下两个规则:
种⼦不同,产⽣不同的随机数。
种⼦相同,即使实例不同也产⽣相同的随机数。
两种⽅式设置种⼦:
Random r= new Random(long seed);
java生成随机数的方法或者 Random r= new Random();r.setSeed(1);即种⼦为1。
对⼀组随机数,只需要记住产⽣的种⼦即可。
⽐如代码:
public class Client {
public static void main(String[] args) {
Random r = new Random(1);
for (int i = 0; i < 4; i++) {
System.out.println( r.nextInt(100));//0→100
}
}
}
不管运⾏⼏次,产⽣的随机数序列⼀定都是:
85,88,47,13
Random类的默认种⼦(⽆参构造)是System.nanoTime()的返回值。注意这个值是距离某⼀个固定时间点的纳秒数,不同的操作系统和硬件有不同的固定时间点,也就是说不同的操作系统其纳秒值是不同的,⽽同⼀个操作系统不同时间纳秒值也会不同,随机数⾃然也就不同了。(顺便说下,System.nanoTime不能⽤于计算⽇期,那是因为“参考”的时间点是不确定的,纳秒值甚⾄可能是负值,这点与System. currentTimeMillis不同。)
Java UUID
UUID(Universally Unique Identifier)全局唯⼀标识符,是指在⼀台机器上⽣成的数字,它保证对在同⼀时空中的所有机器都是唯⼀的。UUID 是长度为16-byte(128-bit)的ID,⽤16进制表⽰,⼀般以形如f81d4fae-7dec-11d0-a765-00a0c91e6bf6。算法的核⼼思想是结合机器的⽹卡、当地时间、⼀个随机数来⽣成UUID。从理论上讲,如果⼀台机器每秒产⽣10000000个UUID,则可以保证(概率意义上)3240年不重复。
⽆须中⼼认证,⾃动⽣成,⽀持⼀台机器每秒⽣成10M次(100纳秒级,其隐含原因是指能够区分的最
⼩时间单位为100ns,将时间作为因⼦时,连续⽣成两个UUID的时间⾄少要间隔100ns)。⽅便存取、分配、排序、查。
代码⽰例:
import java.util.UUID;
public class UTest {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println(uuid);//产⽣的uuid以-隔开
String str = String();
String temp = str.substring(0, 8) + str.substring(9, 13) + str.substring(14, 18) + str.substring(19, 23) + str.substring(24);
System.out.println(temp);
}
}
UUID Version 1:基于时间的UUID
基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使⽤了MAC地址,这个版本的UUID可以保证在全球范围的唯⼀性。但与此同时,使⽤MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地⽅。如果应⽤只是在局域⽹中使⽤,也可以使⽤退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。但由于时间因素的顺序为时间低位在前,⾼位在后,不适合做主键,可以COMB。
UUID Version 3:基于名字的UUID(MD5)
基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字⽣成的UUID的唯⼀性;不同名字空间中的UUID的唯⼀性;相同名字空间中相同名字的UUID重复⽣成是相同的。
UUID Version 4:随机UUID
根据随机数,或者伪随机数⽣成UUID。这种UUID产⽣重复的概率是可以计算出来的,但随机的东西就像是买:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。
UUID Version 5:基于名字的UUID(SHA1)
和版本3的UUID算法类似,只是散列值计算使⽤SHA1(Secure Hash Algorithm 1)算法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论