JAVA 短連結的實現
阿新 • • 發佈:2018-11-22
公司要求實現短連結的功能,整理了實現的思路。
基本思路就是行記錄的主鍵(唯一標識)和N(包含連線中允許的字元數)進位制互相轉換。
例如短連結內容允許包含陣列和大小寫字母,則N=62(數字0~9【10位】、字母a~z【26位】、大寫字母A~Z【26位】)。
該方案是最佳方案。如果沒有行記錄的主鍵進行參考,可以考慮使用redis快取實現ID發號器,來生成唯一標識。
網上也有用hash等方法來實現,但這肯定會有碰撞率,可以直接pass。
程式碼如下:
public class ShortUrlUtil { private static Logger logger = Logger.getLogger(ShortUrlUtil.class); private static char[] charSet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); /** * 將10進位制轉化為62進位制 */ public static String _10_to_62(long number, int length) { Long rest = number; Stack<Character> stack = new Stack<Character>(); StringBuilder result = new StringBuilder(0); while (rest != 0) { stack.add(charSet[new Long((rest - (rest / 62) * 62)).intValue()]); rest = rest / 62; } for (; !stack.isEmpty(); ) { result.append(stack.pop()); } int result_length = result.length(); StringBuilder temp0 = new StringBuilder(); for (int i = 0; i < length - result_length; i++) { temp0.append('0'); } return temp0.toString() + result.toString(); } /** * 將62進位制轉換成10進位制數 */ private static String convertBase62ToDecimal(String ident62) { int decimal = 0; int base = 62; int keisu = 0; int cnt = 0; byte ident[] = ident62.getBytes(); for (int i = ident.length - 1; i >= 0; i--) { int num = 0; if (ident[i] > 48 && ident[i] <= 57) { num = ident[i] - 48; } else if (ident[i] >= 65 && ident[i] <= 90) { num = ident[i] - 65 + 10; } else if (ident[i] >= 97 && ident[i] <= 122) { num = ident[i] - 97 + 10 + 26; } keisu = (int) java.lang.Math.pow((double) base, (double) cnt); decimal += num * keisu; cnt++; } return String.format("%08d", decimal); } /** * @param args */ public static void main(String[] args) { System.out.println("62System=" + _10_to_62(Integer.parseInt("30051"), 6)); System.out.println("10System=" + convertBase62ToDecimal("0007oh")); } }