package com.hundsun.jresplus.web.nosession; import java.security.SecureRandom; /** * * @author LeoHu copy by sagahl copy by fish * */ public final class RandomShortUUID implements UUIDGenerator { /* * The random number generator used by this class to create random based */ private static volatile SecureRandom numberGenerator = new SecureRandom(); private static final int length = 25; private static StringBuilder getBuilder() { SecureRandom ng = numberGenerator; byte[] data = new byte[16]; ng.nextBytes(data); StringBuilder sb = new StringBuilder(length); long bits = data[0] & 0xff; bits = (bits << 8) | (data[1] & 0xff); bits = (bits << 8) | (data[2] & 0xff); bits = (bits << 8) | (data[3] & 0xff); bits = (bits << 8) | (data[4] & 0xff); bits = (bits << 8) | (data[5] & 0xff); bits = (bits << 8) | (data[6] & 0xff); bits = (bits << 6) | (data[7] & 0x3f); append(bits, sb); bits = data[8] & 0xff; bits = (bits << 8) | (data[9] & 0xff); bits = (bits << 8) | (data[10] & 0xff); bits = (bits << 8) | (data[11] & 0xff); bits = (bits << 8) | (data[12] & 0xff); bits = (bits << 8) | (data[13] & 0xff); bits = (bits << 8) | (data[14] & 0xff); bits = (bits << 4) | (data[15] & 0xf); append(bits, sb); return sb; } /** * */ public static String getFixSize() { StringBuilder sb = getBuilder(); int needAdd = length - sb.length(); for (int i = 0; i < needAdd; i++) { sb.append('0'); } return sb.toString(); } /** * */ public static String get() { return getBuilder().toString(); } public String gain() { return get(); } final static char[] Digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x' }; private static final int Radix = Digits.length; private static void append(long i, StringBuilder sb) { char[] buf = new char[13]; int charPos = 12; i = -i; while (i <= -Radix) { buf[charPos--] = Digits[(int) (-(i % Radix))]; i = i / Radix; } buf[charPos] = Digits[(int) (-i)]; sb.append(buf, charPos, (13 - charPos)); } }