摘要:優(yōu)點(diǎn)隨機(jī)性從定義中可以看出,時(shí)間和隨機(jī)數(shù)的加入使得生成的是基本隨機(jī)的。唯一性由于給予的機(jī)器識(shí)別號(hào)的唯一性,保證了不同設(shè)備的也是不同的,而時(shí)間加隨機(jī)數(shù),從理論上講,如果一臺(tái)機(jī)器每秒產(chǎn)生個(gè),則可以保證概率意義上年不重復(fù)。
??UUID(Universally Unique Identifier) : 全局唯一標(biāo)識(shí)符,是指在一臺(tái)機(jī)器上生成的數(shù)字,它保證對(duì)在同一時(shí)空中的所有機(jī)器都是唯一的。按照開(kāi)放軟件基金會(huì)(OSF)制定的標(biāo)準(zhǔn)計(jì)算,用到了以太網(wǎng)卡地址、納秒級(jí)時(shí)間、芯片ID碼和許多可能的數(shù)字。由以下幾部分的組合:當(dāng)前日期和時(shí)間(UUID的第一個(gè)部分與時(shí)間有關(guān),如果你在生成一個(gè)UUID之后,過(guò)幾秒又生成一個(gè)UUID,則第一個(gè)部分不同,其余相同),時(shí)鐘序列,全局唯一的IEEE機(jī)器識(shí)別號(hào)(如果有網(wǎng)卡,從網(wǎng)卡獲得,沒(méi)有網(wǎng)卡以其他方式獲得),UUID的唯一缺陷在于生成的結(jié)果串會(huì)比較長(zhǎng)。
1. 優(yōu)點(diǎn)
1.1. 隨機(jī)性
??從定義中可以看出,時(shí)間和隨機(jī)數(shù)的加入使得生成的UUID是基本隨機(jī)的。算法的核心思想是結(jié)合機(jī)器的網(wǎng)卡、當(dāng)?shù)貢r(shí)間、一個(gè)隨即數(shù)來(lái)生成GUID。
1.2. 唯一性
??由于給予的IEEE機(jī)器識(shí)別號(hào)的唯一性,保證了不同設(shè)備的UUID也是不同的,而時(shí)間加隨機(jī)數(shù),從理論上講,如果一臺(tái)機(jī)器每秒產(chǎn)生10000000個(gè)GUID,則可以保證(概率意義上)3240年不重復(fù)。
2. 樣式
??UUID是由一個(gè)十六位的數(shù)字組成,表現(xiàn)出來(lái)的形式例如
550E8400-E29B-11D4-A716-446655440000
3. 適用范圍
適用于需要唯一的ID,例如數(shù)據(jù)庫(kù)主鍵,分布式系統(tǒng)的模塊ID等
4. 使用方法(Java)
UUID uuid = UUID.randomUUID(); String s = UUID.randomUUID().toString();
5. 代碼分析
/** * @author Administrator * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ import java.net.InetAddress; import java.net.UnknownHostException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Random; public class RandomGUID extends Object { protected final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory .getLog(getClass()); public String valueBeforeMD5 = ""; public String valueAfterMD5 = ""; private static Random myRand; private static SecureRandom mySecureRand; private static String s_id; private static final int PAD_BELOW = 0x10; private static final int TWO_BYTES = 0xFF; /* * Static block to take care of one time secureRandom seed. * It takes a few seconds to initialize SecureRandom. You might * want to consider removing this static block or replacing * it with a "time since first loaded" seed to reduce this time. * This block will run only once per JVM instance. */ static { mySecureRand = new SecureRandom(); long secureInitializer = mySecureRand.nextLong(); myRand = new Random(secureInitializer); try { s_id = InetAddress.getLocalHost().toString(); //s_id表示網(wǎng)卡地址,這個(gè)是固定的,所以只需要第一次調(diào)用定義就可以了 } catch (UnknownHostException e) { e.printStackTrace(); } } /* * Default constructor. With no specification of security option, * this constructor defaults to lower security, high performance. */ public RandomGUID() { getRandomGUID(false); } /* * Constructor with security option. Setting secure true * enables each random number generated to be cryptographically * strong. Secure false defaults to the standard Random function seeded * with a single cryptographically strong random number. */ public RandomGUID(boolean secure) { getRandomGUID(secure); } /* * Method to generate the random GUID */ private void getRandomGUID(boolean secure) { MessageDigest md5 = null; StringBuffer sbValueBeforeMD5 = new StringBuffer(128); try { md5 = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { logger.error("Error: " + e); } try { long time = System.currentTimeMillis(); long rand = 0; if (secure) { rand = mySecureRand.nextLong(); } else { rand = myRand.nextLong(); } sbValueBeforeMD5.append(s_id); sbValueBeforeMD5.append(":"); sbValueBeforeMD5.append(Long.toString(time)); sbValueBeforeMD5.append(":"); sbValueBeforeMD5.append(Long.toString(rand)); valueBeforeMD5 = sbValueBeforeMD5.toString(); md5.update(valueBeforeMD5.getBytes()); byte[] array = md5.digest(); StringBuffer sb = new StringBuffer(32); for (int j = 0; j < array.length; ++j) { int b = array[j] & TWO_BYTES; if (b < PAD_BELOW) sb.append("0"); sb.append(Integer.toHexString(b)); } valueAfterMD5 = sb.toString(); } catch (Exception e) { logger.error("Error:" + e); } } /* * Convert to the standard format for GUID * (Useful for SQL Server UniqueIdentifiers, etc.) * Example: C2FEEEAC-CFCD-11D1-8B05-00600806D9B6 */ public String toString() { String raw = valueAfterMD5.toUpperCase(); StringBuffer sb = new StringBuffer(64); sb.append(raw.substring(0, 8)); sb.append("-"); sb.append(raw.substring(8, 12)); sb.append("-"); sb.append(raw.substring(12, 16)); sb.append("-"); sb.append(raw.substring(16, 20)); sb.append("-"); sb.append(raw.substring(20)); return sb.toString(); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/66910.html
摘要:簡(jiǎn)介的目的,是讓分布式系統(tǒng)中的所有元素,都能有唯一的辨識(shí)信息,而不需要通過(guò)中央控制端來(lái)做辨識(shí)信息的指定。總結(jié)由于參考的生成方式性能強(qiáng)勁,是和的到倍的。 簡(jiǎn)介 UUID 的目的,是讓分布式系統(tǒng)中的所有元素,都能有唯一的辨識(shí)信息,而不需要通過(guò)中央控制端來(lái)做辨識(shí)信息的指定。 uuid 常用場(chǎng)景 IOT 設(shè)備,設(shè)備號(hào); 網(wǎng)站 sessionid,cookie 用戶id; 數(shù)據(jù)庫(kù)主鍵id; ...
摘要:規(guī)范定義來(lái)自于發(fā)布的一個(gè)規(guī)范。其中的字母是進(jìn)制表示,大小寫(xiě)無(wú)關(guān)。在里面的使用的例子其中,最后的個(gè)字符就是我電腦網(wǎng)卡的地址版本安全的安全的和基于時(shí)間的算法相同,但會(huì)把時(shí)間戳的前位置換為的或。 一、簡(jiǎn)介 UUID,是Universally Unique Identifier的縮寫(xiě),UUID出現(xiàn)的目的,是為了讓分布式系統(tǒng)可以不借助中心節(jié)點(diǎn),就可以生成UUID來(lái)標(biāo)識(shí)一些唯一的信息; GUID,...
摘要:什么是全稱,即通用唯一識(shí)別碼。目前最廣泛應(yīng)用的,是微軟公司的全局唯一標(biāo)識(shí)符,而其他重要的應(yīng)用,則有文件系統(tǒng)加密分區(qū)等等。的唯一缺陷在于生成的結(jié)果串會(huì)比較長(zhǎng)。關(guān)于這個(gè)標(biāo)準(zhǔn)使用最普遍的是微軟的。 什么是UUID? UUID全稱:Universally Unique Identifier,即通用唯一識(shí)別碼。 UUID是由一組32位數(shù)的16進(jìn)制數(shù)字所構(gòu)成,是故UUID理論上的總數(shù)為16^32 ...
摘要:用戶指定一個(gè)名字空間和一個(gè)字符串,通過(guò)散列,生成。字符串本身需要是唯一的。。雖然是基于隨機(jī)數(shù),但是重復(fù)的可能性可以忽略不計(jì),因此該版本也是被經(jīng)常使用的版本。。當(dāng)前正在使用的。。 UUID的生成策略: UUID的方式能生成一串唯一隨機(jī)32位長(zhǎng)度數(shù)據(jù),它是無(wú)序的一串?dāng)?shù)據(jù),按照開(kāi)放軟件基金會(huì)(OSF)制定的標(biāo)準(zhǔn)計(jì)算,UUID的生成用到了以太網(wǎng)卡地址、納秒級(jí)時(shí)間、芯片ID碼和許多可能的數(shù)字。U...
閱讀 2885·2021-10-18 13:33
閱讀 841·2019-08-30 14:20
閱讀 2620·2019-08-30 13:14
閱讀 2512·2019-08-29 18:38
閱讀 2879·2019-08-29 16:44
閱讀 1206·2019-08-29 15:23
閱讀 3466·2019-08-29 13:28
閱讀 1909·2019-08-28 18:00