Java随机数和UUID

Java随机数和UUID

Java随机数

  在Java项目中一般是经过Math.random方法和Random类来得到随机数,前者经过生成一个Random类的实例来实现。
  此类产生的是一组伪随机数流,经过使用 48 位的种子,利用线性同余公式产生。在Java中,随机数的产生取决于种子,随机数和种子之间的关系听从如下两个规则:html

  • 种子不一样,产生不一样的随机数。
  • 种子相同,即便实例不一样也产生相同的随机数。
    两种方式设置种子:
    Random r= new Random(long seed);
    或者 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

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 = uuid.toString();   
            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);
        }
    }

解析的不错:http://www.cppblog.com/Fox/archive/2009/12/06/uuid_algorithm_analysis.html安全

UUID Version 1:基于时间的UUIDdom

基于时间的UUID经过计算当前时间戳、随机数和机器MAC地址获得。因为在算法中使用了MAC地址,这个版本的UUID能够保证在全球范围的惟一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。若是应用只是在局域网中使用,也可使用退化的算法,以IP地址来代替MAC地址--Java的UUID每每是这样实现的(固然也考虑了获取MAC的难度)。但因为时间因素的顺序为时间低位在前,高位在后,不适合作主键,能够COMB。ui

UUID Version 3:基于名字的UUID(MD5)操作系统

基于名字的UUID经过计算名字和名字空间的MD5散列值获得。这个版本的UUID保证了:相同名字空间中不一样名字生成的UUID的惟一性;不一样名字空间中的UUID的惟一性;相同名字空间中相同名字的UUID重复生成是相同的。code

UUID Version 4:随机UUIDhtm

根据随机数,或者伪随机数生成UUID。这种UUID产生重复的几率是能够计算出来的,但随机的东西就像是买彩票:你期望它发财是不可能的,但狗屎运一般会在不经意中到来。blog

UUID Version 5:基于名字的UUID(SHA1)

和版本3的UUID算法相似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。

相关文章
相关标签/搜索