假如要生成6位的字符 如何才能可靠的生成更多数据。
10进制 最大只能生成 10 ^ 6 - 1 =999999个
16进制 最大只能生成 16 ^ 6 - 1 =16777215个
16进制里面已经包含了 A B C D E F 这几个字母
62进制 最大竟能生成 62 ^ 6 - 1 =56800235583个 基本上够玩了吧。
A-Z a-z 0-9刚好等于62位
64进制 因为包含了特殊字段 用于短链接有点特殊 所以现在大部分都是使用62进制或者其他的算法。
接下来将使用原有的编码串转换为62进制即可嫁接到现有业务中去 仅需少许改动。
如果原有的id是10进制数字 那么就可以把10进制转换为62进制即可。
如果原有的id是字符串或者其他标识 可以用先获取到hashcode后 当作是做个10进制数再进行62进制转换。
10进制转换62进制的逻辑就是 一直循环用62取余 然后倒序。代码如下
private static String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
private static int scale = 62;
private static int minlen = 6;
public static String base62Encode(long num) {
StringBuilder sb = new StringBuilder();
int remainder;
while (num > scale - 1) {//大于62-1才计算 小于就直接是自身即可
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();
return StringUtils.leftPad(value, minlen, '0');
}
public static void main(String[] args) {
System.out.println( base62Encode(9000000000L));
}
上面程序输出 9p558K
这么大的数值就用这几个字符表达就能完成了。可想这个玩意还能用于很多场景 比如id 用少量的字符表示更大的数据、临时转码等场景
在短链接领域我知道是 B站 抖音 估计都是用的62进制。
用随便一个转换工具网站 转换一个地址 如 http://m6z.cn/5X6an7 看起来也像是62进制。
上面的chars
还能调整顺序 变为自己的base62编码。这样的玩法还可以变通为58进制等。
如果你的业务线很大 还可以为62进制编码加业务编码前缀。如 推荐系统的规则为88开头,客户系统为99开头。