这里列出两种短链接生成的方法供有需要的朋友参考。
方法一
这种方法的的缺点很明显。
1. 缺点一
必须指定短链接的长度(for循环的次数即是短链的长度)。一旦设置,如果占用满,将需要更改代码重新发布。不利于维护
2. 缺点二
会发现这个代码只是生成key,与本身要生成的链接没有任何关系,所以需要手动记录key与value的对应关系。比如记录到redis中。(其实个人并并不认为这是个缺点,短链接要考虑的一个场景就是过期)
private static final char[] BASE_62_CHARS = "abcdefghzjklmnopqrstuvwxyzABCDEFGHZJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
private static final int BASE_62_CHARS_LENGTH = BASE_62_CHARS.length;
public static String method1(){
StringBuffer sb = new StringBuffer();
Random random = new Random();
for(int i = 0; i < 6; i++) {
int index = random.nextInt(BASE_62_CHARS_LENGTH);
sb.append(BASE_62_CHARS[index]);
}
return sb.toString();
}
方法二
这个是基于方法一的改进方法,主要修复的是缺点一。
引入了一个增量变量startIndex
,每次生成后对该增量变量进行累计1,使用redis来存储startIndex
是个很好的解决方案。
该方法同样存在缺点2。但是优点在设置了startIndex
后,该代码不需要再维护,短链接的长度会随着startIndex
的递增而增加。
private static final char[] BASE_62_CHARS = "abcdefghzjklmnopqrstuvwxyzABCDEFGHZJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
private static final int BASE_62_CHARS_LENGTH = BASE_62_CHARS.length;
public static void main(String[] args) {
int startIndex= 10000;
System.out.println(formBase10(startIndex));
}
public static String formBase10(long i){
StringBuffer sb = new StringBuffer();
if(i == 0){
return "a";
}
while (i > 0){
i = formBase10(i, sb);
}
return sb.toString();
}
public static long formBase10(long i, StringBuffer sb){
int rem = (int)(i % BASE_62_CHARS_LENGTH);
sb.append(BASE_62_CHARS[rem]);
long r = (i / BASE_62_CHARS_LENGTH);
return r;
}