解析URL短链代码中62位字符数组的遍历与映射逻辑
URL短链工具字符生成逻辑解析
我正在开发一款类似TinyURL的URL短链工具,重构自一段代码,现在需要理解这段
setup()方法的逻辑:private void setup(){ keyMap = new HashMap<String, String>(); myRand = new Random(); myChars = new char[62]; for (int i = 0; i < 62; i++) { int j = 0; if (i < 10) { j = i + 48; } else if (i > 9 && i <= 35) { j = i + 55; } else { j = i + 61; } myChars[i] = (char) j; } }为何要遍历长度为62的char数组,且在i<10时加48、9<i≤35时加55、其余情况加61来生成字符映射?
为什么用长度为62的数组?
- 这是短链工具的常规操作!我们常用的短链字符集是数字(0-9)+大写字母(A-Z)+小写字母(a-z),算下来刚好是10+26+26=62个字符。这个字符集的优势很明显:既足够简洁(字符种类多,短长度就能生成海量组合),又能让用户轻松识别输入,不会出现难以辨认的特殊字符。比如短链长度设为6的话,就能生成62^6≈560亿种不同的短链,完全能满足日常业务需求。
为什么要加不同的数值生成字符?
这其实是在利用ASCII码的数值对应关系,手动把数组索引转换成目标字符:
- 当
i < 10时,i是0到9,加上48后,刚好对应ASCII码里数字'0'到'9'的数值('0'的ASCII码是48,'9'是57),这样就把0-9的索引转成了对应的数字字符。 - 当
9 < i ≤35时,i是10到35(一共26个值),加上55后,10+55=65(对应大写字母'A'的ASCII码),35+55=90(对应大写字母'Z'的ASCII码),刚好把这部分索引转成A-Z的大写字母。 - 剩下的i是36到61(也是26个值),加上61后,36+61=97(对应小写字母'a'的ASCII码),61+61=122(对应小写字母'z'的ASCII码),完美转换成a-z的小写字母。
说白了,这段代码就是在预先构建一个包含所有数字、大小写字母的字符池,后面生成短链的时候,就可以随机从这个池子里挑字符,组合成唯一的短链标识啦~
内容的提问来源于stack exchange,提问作者blue-sky
相关产品推荐
相关产品推荐

