【java】性能翻倍的超短19位UUID生成工具类

来源:互联网 发布:绝对值编码器编程实例 编辑:程序博客网 时间:2024/06/06 19:38
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package p2p.utils;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5. import java.util.UUID;  
  6.   
  7. public class UuidUtil {  
  8.   
  9.     final static char[] digits = { '0''1''2''3''4''5''6''7''8',  
  10.             '9''a''b''c''d''e''f''g''h''i''j''k''l',  
  11.             'm''n''o''p''q''r''s''t''u''v''w''x''y',  
  12.             'z''A''B''C''D''E''F''G''H''I''J''K''L',  
  13.             'M''N''O''P''Q''R''S''T''U''V''W''X''Y',  
  14.             'Z' };  
  15.   
  16.     final static Map<Character, Integer> digitMap = new HashMap<Character, Integer>();  
  17.   
  18.     static {  
  19.         for (int i = 0; i < digits.length; i++) {  
  20.             digitMap.put(digits[i], (int) i);  
  21.         }  
  22.     }  
  23.   
  24.     /** 
  25.      * 支持的最大进制数 
  26.      */  
  27.     public static final int MAX_RADIX = digits.length;  
  28.   
  29.     /** 
  30.      * 支持的最小进制数 
  31.      */  
  32.     public static final int MIN_RADIX = 2;  
  33.   
  34.     /** 
  35.      * 将长整型数值转换为指定的进制数(最大支持62进制,字母数字已经用尽) 
  36.      *  
  37.      * @param i 
  38.      * @param radix 
  39.      * @return 
  40.      */  
  41.     public static String toString(long i, int radix) {  
  42.         if (radix < MIN_RADIX || radix > MAX_RADIX)  
  43.             radix = 10;  
  44.         if (radix == 10)  
  45.             return Long.toString(i);  
  46.   
  47.         final int size = 65;  
  48.         int charPos = 64;  
  49.   
  50.         char[] buf = new char[size];  
  51.         boolean negative = (i < 0);  
  52.   
  53.         if (!negative) {  
  54.             i = -i;  
  55.         }  
  56.   
  57.         while (i <= -radix) {  
  58.             buf[charPos--] = digits[(int) (-(i % radix))];  
  59.             i = i / radix;  
  60.         }  
  61.         buf[charPos] = digits[(int) (-i)];  
  62.   
  63.         if (negative) {  
  64.             buf[--charPos] = '-';  
  65.         }  
  66.   
  67.         return new String(buf, charPos, (size - charPos));  
  68.     }  
  69.   
  70.     static NumberFormatException forInputString(String s) {  
  71.         return new NumberFormatException("For input string: \"" + s + "\"");  
  72.     }  
  73.   
  74.     /** 
  75.      * 将字符串转换为长整型数字 
  76.      *  
  77.      * @param s 
  78.      *            数字字符串 
  79.      * @param radix 
  80.      *            进制数 
  81.      * @return 
  82.      */  
  83.     public static long toNumber(String s, int radix) {  
  84.         if (s == null) {  
  85.             throw new NumberFormatException("null");  
  86.         }  
  87.   
  88.         if (radix < MIN_RADIX) {  
  89.             throw new NumberFormatException("radix " + radix  
  90.                     + " less than Numbers.MIN_RADIX");  
  91.         }  
  92.         if (radix > MAX_RADIX) {  
  93.             throw new NumberFormatException("radix " + radix  
  94.                     + " greater than Numbers.MAX_RADIX");  
  95.         }  
  96.   
  97.         long result = 0;  
  98.         boolean negative = false;  
  99.         int i = 0, len = s.length();  
  100.         long limit = -Long.MAX_VALUE;  
  101.         long multmin;  
  102.         Integer digit;  
  103.   
  104.         if (len > 0) {  
  105.             char firstChar = s.charAt(0);  
  106.             if (firstChar < '0') {  
  107.                 if (firstChar == '-') {  
  108.                     negative = true;  
  109.                     limit = Long.MIN_VALUE;  
  110.                 } else if (firstChar != '+')  
  111.                     throw forInputString(s);  
  112.   
  113.                 if (len == 1) {  
  114.                     throw forInputString(s);  
  115.                 }  
  116.                 i++;  
  117.             }  
  118.             multmin = limit / radix;  
  119.             while (i < len) {  
  120.                 digit = digitMap.get(s.charAt(i++));  
  121.                 if (digit == null) {  
  122.                     throw forInputString(s);  
  123.                 }  
  124.                 if (digit < 0) {  
  125.                     throw forInputString(s);  
  126.                 }  
  127.                 if (result < multmin) {  
  128.                     throw forInputString(s);  
  129.                 }  
  130.                 result *= radix;  
  131.                 if (result < limit + digit) {  
  132.                     throw forInputString(s);  
  133.                 }  
  134.                 result -= digit;  
  135.             }  
  136.         } else {  
  137.             throw forInputString(s);  
  138.         }  
  139.         return negative ? result : -result;  
  140.     }  
  141.   
  142.     /** 
  143.      * 编写uuid生成工具方法 
  144.      * @param val 
  145.      * @param digits 
  146.      * @return 
  147.      */  
  148.     public static String digits(long val, int digits) {  
  149.         long hi = 1L << (digits * 4);  
  150.         return toString(hi | (val & (hi - 1)), MAX_RADIX)  
  151.                 .substring(1);  
  152.     }  
  153.       
  154.     /** 
  155.      * 以62进制(字母加数字)生成19位UUID,最短的UUID 
  156.      *  
  157.      * @return 
  158.      */  
  159.     public static String uuid() {  
  160.         UUID uuid = UUID.randomUUID();  
  161.         StringBuilder sb = new StringBuilder();  
  162.         sb.append(digits(uuid.getMostSignificantBits() >> 328));  
  163.         sb.append(digits(uuid.getMostSignificantBits() >> 164));  
  164.         sb.append(digits(uuid.getMostSignificantBits(), 4));  
  165.         sb.append(digits(uuid.getLeastSignificantBits() >> 484));  
  166.         sb.append(digits(uuid.getLeastSignificantBits(), 12));  
  167.         return sb.toString();  
  168.     }  
  169.   
  170. }  
0 0