java uuid 随机数_Java随机数和UUID
Java隨機(jī)數(shù)和UUID#
Java隨機(jī)數(shù)
在Java項(xiàng)目中通常是通過(guò)Math.random方法和Random類(lèi)來(lái)獲得隨機(jī)數(shù),前者通過(guò)生成一個(gè)Random類(lèi)的實(shí)例來(lái)實(shí)現(xiàn)。
此類(lèi)產(chǎn)生的是一組偽隨機(jī)數(shù)流,通過(guò)使用 48 位的種子,利用線(xiàn)性同余公式產(chǎn)生。在Java中,隨機(jī)數(shù)的產(chǎn)生取決于種子,隨機(jī)數(shù)和種子之間的關(guān)系遵從以下兩個(gè)規(guī)則:
種子不同,產(chǎn)生不同的隨機(jī)數(shù)。
種子相同,即使實(shí)例不同也產(chǎn)生相同的隨機(jī)數(shù)。
兩種方式設(shè)置種子:
Random r= new Random(long seed);
或者 Random r= new Random();r.setSeed(1);即種子為1。
對(duì)一組隨機(jī)數(shù),只需要記住產(chǎn)生的種子即可。
比如代碼:
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
}
}
}
不管運(yùn)行幾次,產(chǎn)生的隨機(jī)數(shù)序列一定都是:
85,88,47,13
Random類(lèi)的默認(rèn)種子(無(wú)參構(gòu)造)是System.nanoTime()的返回值。注意這個(gè)值是距離某一個(gè)固定時(shí)間點(diǎn)的納秒數(shù),不同的操作系統(tǒng)和硬件有不同的固定時(shí)間點(diǎn),也就是說(shuō)不同的操作系統(tǒng)其納秒值是不同的,而同一個(gè)操作系統(tǒng)不同時(shí)間納秒值也會(huì)不同,隨機(jī)數(shù)自然也就不同了。(順便說(shuō)下,System.nanoTime不能用于計(jì)算日期,那是因?yàn)椤皡⒖肌钡臅r(shí)間點(diǎn)是不確定的,納秒值甚至可能是負(fù)值,這點(diǎn)與System. currentTimeMillis不同。)
Java UUID
UUID(Universally Unique Identifier)全局唯一標(biāo)識(shí)符,是指在一臺(tái)機(jī)器上生成的數(shù)字,它保證對(duì)在同一時(shí)空中的所有機(jī)器都是唯一的。UUID是長(zhǎng)度為16-byte(128-bit)的ID,用16進(jìn)制表示,一般以形如f81d4fae-7dec-11d0-a765-00a0c91e6bf6。算法的核心思想是結(jié)合機(jī)器的網(wǎng)卡、當(dāng)?shù)貢r(shí)間、一個(gè)隨機(jī)數(shù)來(lái)生成UUID。從理論上講,如果一臺(tái)機(jī)器每秒產(chǎn)生10000000個(gè)UUID,則可以保證(概率意義上)3240年不重復(fù)。
無(wú)須中心認(rèn)證,自動(dòng)生成,支持一臺(tái)機(jī)器每秒生成10M次(100納秒級(jí),其隱含原因是指能夠區(qū)分的最小時(shí)間單位為100ns,將時(shí)間作為因子時(shí),連續(xù)生成兩個(gè)UUID的時(shí)間至少要間隔100ns)。方便存取、分配、排序、查找。
代碼示例:
import java.util.UUID;
public class UTest {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println(uuid);//產(chǎn)生的uuid以-隔開(kāi)
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);
}
}
UUID Version 1:基于時(shí)間的UUID
基于時(shí)間的UUID通過(guò)計(jì)算當(dāng)前時(shí)間戳、隨機(jī)數(shù)和機(jī)器MAC地址得到。由于在算法中使用了MAC地址,這個(gè)版本的UUID可以保證在全球范圍的唯一性。但與此同時(shí),使用MAC地址會(huì)帶來(lái)安全性問(wèn)題,這就是這個(gè)版本UUID受到批評(píng)的地方。如果應(yīng)用只是在局域網(wǎng)中使用,也可以使用退化的算法,以IP地址來(lái)代替MAC地址--Java的UUID往往是這樣實(shí)現(xiàn)的(當(dāng)然也考慮了獲取MAC的難度)。但由于時(shí)間因素的順序?yàn)闀r(shí)間低位在前,高位在后,不適合做主鍵,可以COMB。
UUID Version 3:基于名字的UUID(MD5)
基于名字的UUID通過(guò)計(jì)算名字和名字空間的MD5散列值得到。這個(gè)版本的UUID保證了:相同名字空間中不同名字生成的UUID的唯一性;不同名字空間中的UUID的唯一性;相同名字空間中相同名字的UUID重復(fù)生成是相同的。
UUID Version 4:隨機(jī)UUID
根據(jù)隨機(jī)數(shù),或者偽隨機(jī)數(shù)生成UUID。這種UUID產(chǎn)生重復(fù)的概率是可以計(jì)算出來(lái)的,但隨機(jī)的東西就像是買(mǎi)彩票:你指望它發(fā)財(cái)是不可能的,但狗屎運(yùn)通常會(huì)在不經(jīng)意中到來(lái)。
UUID Version 5:基于名字的UUID(SHA1)
和版本3的UUID算法類(lèi)似,只是散列值計(jì)算使用SHA1(Secure Hash Algorithm 1)算法。
總結(jié)
以上是生活随笔為你收集整理的java uuid 随机数_Java随机数和UUID的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 查看zynq 的 id 或者DNA
- 下一篇: Java生成随机数原理_java随机数生