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)算法。

相關文章
相關標籤/搜索