国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

【Java】UUID的生成

yzzz / 2899人閱讀

摘要:優(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

相關(guān)文章

  • 使用java9uuid生成方式,讓uuid生成速度提升一個(gè)檔

    摘要:簡(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; ...

    jackwang 評(píng)論0 收藏0
  • 關(guān)于UUID二三事

    摘要:規(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,...

    2json 評(píng)論0 收藏0
  • 通用唯一標(biāo)識(shí)碼UUID介紹及使用。

    摘要:什么是全稱,即通用唯一識(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 ...

    pkhope 評(píng)論0 收藏0
  • 分布式ID系列(2)——UUID適合做分布式ID嗎

    摘要:用戶指定一個(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...

    wayneli 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<