這里列出兩種短鏈接生成的方法供有需要的朋友參考。
方法一
這種方法的的缺點很明顯。
1. 缺點一
必須指定短鏈接的長度(for循環(huán)的次數(shù)即是短鏈的長度)。一旦設(shè)置,如果占用滿,將需要更改代碼重新發(fā)布。不利于維護(hù)
2. 缺點二
會發(fā)現(xiàn)這個代碼只是生成key,與本身要生成的鏈接沒有任何關(guān)系,所以需要手動記錄key與value的對應(yīng)關(guān)系。比如記錄到redis中。(其實個人并并不認(rèn)為這是個缺點,短鏈接要考慮的一個場景就是過期)
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();
}
方法二
這個是基于方法一的改進(jìn)方法,主要修復(fù)的是缺點一。
引入了一個增量變量startIndex,每次生成后對該增量變量進(jìn)行累計1,使用redis來存儲startIndex是個很好的解決方案。
該方法同樣存在缺點2。但是優(yōu)點在設(shè)置了startIndex后,該代碼不需要再維護(hù),短鏈接的長度會隨著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;
}