在Java項目中一般是經過Math.random方法和Random類來得到隨機數,前者經過生成一個Random類的實例來實現。
此類產生的是一組僞隨機數流,經過使用 48 位的種子,利用線性同餘公式產生。在Java中,隨機數的產生取決於種子,隨機數和種子之間的關係聽從如下兩個規則:html
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(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)算法。