62进制简单介绍
62进制算法,就是26个大写字母、26个小写字母、10个数字,加起来就是62个字符。常见的应用场景是一些在十进制下很长的数字,转换为62进制后,长度会大幅缩小。
转换算法
package com.coderbbb.blogv2.utils;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class IdConvertUtil {
private static final String CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
private static final int SCALE = 62;
/**
* 数字转62进制
* @param num
* @return
*/
public static String encode(long num) {
StringBuilder sb = new StringBuilder();
int remainder;
while (num > SCALE - 1) {
//对 SCALE 进行求余,然后将余数追加至 sb 中,由于是从末位开始追加的,因此最后需要反转字符串
remainder = Long.valueOf(num % SCALE).intValue();
sb.append(CHARS.charAt(remainder));
//除以进制数,获取下一个末尾数
num = num / SCALE;
}
sb.append(CHARS.charAt(Long.valueOf(num).intValue()));
String value = sb.reverse().toString();
int minLength = 1;
return StringUtils.leftPad(value, minLength, '0');
}
/**
* 62进制转为数字
* @param str
* @return
*/
public static long decode(String str) {
//将 0 开头的字符串进行替换
str = str.replace("^0*", "");
long value = 0;
char tempChar;
int tempCharValue;
for (int i = 0; i < str.length(); i++) {
//获取字符
tempChar = str.charAt(i);
//单字符值
tempCharValue = CHARS.indexOf(tempChar);
//单字符值在进制规则下表示的值
value += (long) (tempCharValue * Math.pow(SCALE, str.length() - i - 1));
}
return value;
}
}
乱序
如果你不想让别人轻易的推断出你62进制转换后的字符串和10进制数字的对应关系,可以把上面代码中的CHARS
变量中的字符串顺序打乱,这样的话猜出映射关系的难度会提升很多。