有时候,我们需要短一点的唯一字符串,在我们用雪花算法生成18位的长整形后,需要用转成10位的62进制,这里为什么不选择64进制,因为64进制会含有+-这些特殊字符,因此下面实现的工具类就是62进制的:
/*** 十进制与62进制互转工具类,如果是64进制,则需要baseDigits 后面加上+-* @author forever**/public class ConversionUtil {//这里最后一位用-比较好,因为/比较特殊private static final String baseDigits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";private static final int BASE = baseDigits.length();//通过余数获取对应的64进制表示private static final char[] digitsChar = baseDigits.toCharArray();//这里预留了足够的空位122位private static final int FAST_SIZE = 'z';//这个是为了存放字母对应的值,比如-对应63,但是-是45,也就是 digitsIndex[45]=63//[digitsChar[-]会自动转变成45,这样子十六进制转十进制,就可以获取到前面的数字了。private static final int[] digitsIndex = new int[FAST_SIZE + 1];static {for (int i = 0; i < FAST_SIZE; i++) {digitsIndex[i] = -1;}//构造:a[117]=30这样的数组for (int i = 0; i < BASE; i++) {digitsIndex[digitsChar[i]] = i;}}//64进制转十进制public static long decode(String s) {long result = 0L;long multiplier = 1;for (int pos = s.length() - 1; pos >= 0; pos--) {int index = getIndex(s, pos);result += index * multiplier;multiplier *= BASE;}return result;}//十进制转64进制public static String encode(long number) {if (number < 0)System.out.println("Number(Base64) must be positive: " + number);if (number == 0)return "0";StringBuilder buf = new StringBuilder();while (number != 0) {//获取余数buf.append(digitsChar[(int) (number % BASE)]);//剩下的值number /= BASE;}//反转return buf.reverse().toString();}//获取对应的的64进制的值private static int getIndex(String s, int pos) {char c = s.charAt(pos);if (c > FAST_SIZE) {System.out.println("Unknow character for Base64: " + s);}int index = digitsIndex[c];if (index == -1) {System.out.println("Unknow character for Base64: " + s);}return index;}public static void main(String[] args) {Long l=639208466002477056l;String str = encode(l);System.out.println(str);Long g = decode(str);System.out.println(g);}}
