tinguo002

           

          java生成uuid(轉(zhuǎn)載)

          public class UniqId {  
              
          private static char[] digits = '0''1''2''3''4''5''6''7',  
                      
          '8''9''a''b''c''d''e''f' }
          ;  
            
              
          private static Map<Character, Integer> rDigits = new HashMap<Character, Integer>(  
                      
          16);  
              
          static {  
                  
          for (int i = 0; i < digits.length; ++i) {  
                      rDigits.put(digits[i], i);  
                  }
            
              }
            
            
              
          private static UniqId me = new UniqId();  
              
          private String hostAddr;  
              
          private Random random = new SecureRandom();  
              
          private MessageDigest mHasher;  
              
          private UniqTimer timer = new UniqTimer();  
            
              
          private ReentrantLock opLock = new ReentrantLock();  
            
              
          private UniqId() {  
                  
          try {  
                      InetAddress addr 
          = InetAddress.getLocalHost();  
            
                      hostAddr 
          = addr.getHostAddress();  
                  }
           catch (IOException e) {  
                      hostAddr 
          = String.valueOf(System.currentTimeMillis());  
                  }
            
            
                  
          if (hostAddr == null || hostAddr.length() == 0  
                          
          || "127.0.0.1".equals(hostAddr)) {  
                      hostAddr 
          = String.valueOf(System.currentTimeMillis());  
                  }
            
            
                  
          try {  
                      mHasher 
          = MessageDigest.getInstance("MD5");  
                  }
           catch (NoSuchAlgorithmException nex) {  
                      mHasher 
          = null;  
                  }
            
              }
            
            
              
          /** 
               * 獲取UniqID實(shí)例 
               *  
               * 
          @return UniqId 
               
          */
            
              
          public static UniqId getInstance() {  
                  
          return me;  
              }
            
            
              
          /** 
               * 獲得不會(huì)重復(fù)的毫秒數(shù) 
               *  
               * 
          @return 
               
          */
            
              
          public long getUniqTime() {  
                  
          return timer.getCurrentTime();  
              }
            
            
              
          /** 
               * 獲得UniqId 
               *  
               * 
          @return uniqTime-randomNum-hostAddr-threadId 
               
          */
            
              
          public String getUniqID() {  
                  StringBuffer sb 
          = new StringBuffer();  
                  
          long t = timer.getCurrentTime();  
            
                  sb.append(t);  
            
                  sb.append(
          "-");  
            
                  sb.append(random.nextInt(
          8999+ 1000);  
            
                  sb.append(
          "-");  
                  sb.append(hostAddr);  
            
                  sb.append(
          "-");  
                  sb.append(Thread.currentThread().hashCode());  
            
                  
          return sb.toString();  
              }
            
            
              
          /** 
               * 獲取MD5之后的uniqId string 
               *  
               * 
          @return uniqId md5 string 
               
          */
            
              
          public String getUniqIDHashString() {  
                  
          return hashString(getUniqID());  
              }
            
            
              
          /** 
               * 獲取MD5之后的uniqId 
               *  
               * 
          @return byte[16] 
               
          */
            
              
          public byte[] getUniqIDHash() {  
                  
          return hash(getUniqID());  
              }
            
            
              
          /** 
               * 對(duì)字符串進(jìn)行md5 
               *  
               * 
          @param str 
               * 
          @return md5 byte[16] 
               
          */
            
              
          public byte[] hash(String str) {  
                  opLock.lock();  
                  
          try {  
                      
          byte[] bt = mHasher.digest(str.getBytes("UTF-8"));  
                      
          if (null == bt || bt.length != 16{  
                          
          throw new IllegalArgumentException("md5 need");  
                      }
            
                      
          return bt;  
                  }
           catch (UnsupportedEncodingException e) {  
                      
          throw new RuntimeException("unsupported utf-8 encoding", e);  
                  }
           finally {  
                      opLock.unlock();  
                  }
            
              }
            
            
              
          /** 
               * 對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行md5 
               *  
               * 
          @param str 
               * 
          @return md5 byte[16] 
               
          */
            
              
          public byte[] hash(byte[] data) {  
                  opLock.lock();  
                  
          try {  
                      
          byte[] bt = mHasher.digest(data);  
                      
          if (null == bt || bt.length != 16{  
                          
          throw new IllegalArgumentException("md5 need");  
                      }
            
                      
          return bt;  
                  }
           finally {  
                      opLock.unlock();  
                  }
            
              }
            
            
              
          /** 
               * 對(duì)字符串進(jìn)行md5 string 
               *  
               * 
          @param str 
               * 
          @return md5 string 
               
          */
            
              
          public String hashString(String str) {  
                  
          byte[] bt = hash(str);  
                  
          return bytes2string(bt);  
              }
            
            
              
          /** 
               * 對(duì)字節(jié)流進(jìn)行md5 string 
               *  
               * 
          @param str 
               * 
          @return md5 string 
               
          */
            
              
          public String hashBytes(byte[] str) {  
                  
          byte[] bt = hash(str);  
                  
          return bytes2string(bt);  
              }
            
            
              
          /** 
               * 將一個(gè)字節(jié)數(shù)組轉(zhuǎn)化為可見(jiàn)的字符串 
               *  
               * 
          @param bt 
               * 
          @return 
               
          */
            
              
          public String bytes2string(byte[] bt) {  
                  
          int l = bt.length;  
            
                  
          char[] out = new char[l << 1];  
            
                  
          for (int i = 0, j = 0; i < l; i++{  
                      out[j
          ++= digits[(0xF0 & bt[i]) >>> 4];  
                      out[j
          ++= digits[0x0F & bt[i]];  
                  }
            
            
                  
          return new String(out);  
              }
            
            
              
          /** 
               * 將字符串轉(zhuǎn)換為bytes 
               *  
               * 
          @param str 
               * 
          @return byte[] 
               
          */
            
              
          public byte[] string2bytes(String str) {  
                  
          if (null == str) {  
                      
          throw new NullPointerException("參數(shù)不能為空");  
                  }
            
                  
          if (str.length() != 32{  
                      
          throw new IllegalArgumentException("字符串長(zhǎng)度必須是32");  
                  }
            
                  
          byte[] data = new byte[16];  
                  
          char[] chs = str.toCharArray();  
                  
          for (int i = 0; i < 16++i) {  
                      
          int h = rDigits.get(chs[i * 2]).intValue();  
                      
          int l = rDigits.get(chs[i * 2 + 1]).intValue();  
                      data[i] 
          = (byte) ((h & 0x0F<< 4 | (l & 0x0F));  
                  }
            
                  
          return data;  
              }
            
            
              
          /** 
               * 實(shí)現(xiàn)不重復(fù)的時(shí)間 
               *  
               * 
          @author dogun 
               
          */
            
              
          private static class UniqTimer {  
                  
          private AtomicLong lastTime = new AtomicLong(System.currentTimeMillis());  
            
                  
          public long getCurrentTime() {  
                      
          return this.lastTime.incrementAndGet();  
                  }
            
              }
            
          }
            



          歡迎大家訪問(wèn)我的個(gè)人網(wǎng)站 萌萌的IT人

          posted on 2014-04-16 09:07 一堣而安 閱讀(576) 評(píng)論(0)  編輯  收藏 所屬分類: java

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 湘乡市| 百色市| 博客| 正镶白旗| 南昌县| 武川县| 陇南市| 南平市| 宁城县| 曲阜市| 密山市| 周至县| 厦门市| 那曲县| 中阳县| 鹤壁市| 井研县| 敦化市| 拜泉县| 诸城市| 长泰县| 曲阜市| 晋江市| 宜昌市| 重庆市| 新龙县| 巴塘县| 平顶山市| 开化县| 铁岭县| 阜宁县| 西安市| 台山市| 西藏| 济源市| 镇宁| 神农架林区| 道孚县| 兴隆县| 光山县| 绵阳市|