唯一字符串 2021-12-03 10:50 简介:唯一字符串SerialNumber,适合做requestId等,唯一标记请求。 组成:类似这种:1Fkr3ybMcMEjDuFf6w,18位。前9位是根据当前纳秒时间转换生成,后9位是随机所有数字字母生成。 速度:生成1000000(一百万)个平均需要600毫秒。 优点:不是最快的, 但不加锁,速度已经很优秀,且基本保证永不重复;简单,不需读取其他信息。 缺点:长度大,字母多,若需储存则占用较大空间。不包含时间信息,不可携带业务含义。 ```java package com.example.demo.utils; import java.util.HashSet; import java.util.Random; import java.util.Set; /** * 唯一字符串,适合做requestId等,唯一标记请求 */ public class SerialNumberUtil { /**随机因子*/ private static final char[] randomFactor = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); private static final int randomFactorLength = randomFactor.length; private static final Random r = new Random(); /** * base62压缩nanotime+uuid后(*)位 * 长度:18位 */ public static String getSerialNumberNew2(){ StringBuilder sb = new StringBuilder(); String time = Base62._10_to_62(System.nanoTime()); sb.append(time); for(int i = 0; i < 18 - time.length(); i++){ sb.append(randomFactor[r.nextInt(randomFactorLength)]); } return sb.toString(); } public static void main(String[] args) { System.out.println(getSerialNumberNew2()); //1Fkr3ybMcMEjDuFf6w Set<String> set = new HashSet<>(1500000); long startTime = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { String str = getSerialNumberNew2(); set.add(str); } long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime); System.out.println(set.size()); } } ``` ```java package com.example.demo.utils; import java.util.Stack; /** * Created by wangchunjiang on 2017/9/8 0008. */ public class Base62 { private final static char[] charSet = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; /** * 将10进制转化为62进制 * @param number * @return */ public static String _10_to_62(long number){ Long rest = number; Stack<Character> stack = new Stack<Character>(); StringBuilder result = new StringBuilder(0); while(rest != 0){ stack.add(charSet[new Long((rest - (rest / 62) * 62)).intValue()]); rest = rest / 62; } for(; !stack.isEmpty(); ){ result.append(stack.pop()); } return result.toString(); } } ``` --END--
发表评论