1. 程式人生 > >JAVA 短連結的實現

JAVA 短連結的實現

公司要求實現短連結的功能,整理了實現的思路。

基本思路就是行記錄的主鍵(唯一標識)和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"));
    }
}