短链生成方法,将自增的ID转化为62进制字符串即可缩短长度。
package com.urlservices.common;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//自定义数值跟字符串的映射
public class ShortURLHelper {
private static Logger logger = LoggerFactory.getLogger(ShortURLHelper.class);
// 自定62进制义字符
private final static String sp = "iBCW3eQs5RJagMT7nOX8f2ozwGKxDZFbuNLSlYVIt4q6Ay1cP0Urkjmp9hvdEH";
private final static int radix = sp.length();
/**
* 将自定义62进制的字符串转为10进制long
*
* @param str
* @return
*/
public static long StrToNum(String str) {
try {
long result = 0;
for (int i = 0; i < str.length(); i++) {
result += sp.indexOf(str.charAt(i)) * Math.pow(radix, i);
}
return result;
} catch (Exception ex) {
logger.error("将code转为long异常,input:"+str+",ex:"+ex.getMessage());
ex.printStackTrace();
return -1;
}
}
/**
* 将10进制的数值转换为自定义的62进制的字符串
*
* @param num
* @return
*/
public static String NumToStr(long num) {
try {
if (num < 0) {
return null;
}
StringBuilder buf = new StringBuilder();
int remainder = 0;
do {
remainder = (int) (num % radix);// 求余数
num = num / radix;// 除以基数
buf.append(sp.charAt(remainder));// 保存余数,记得要倒叙排列
} while (num != 0);
return buf.toString();
} catch (Exception ex) {
logger.error("将long转为code异常,input:"+num+",ex:"+ex.getMessage());
return null;
}
}
public static void main(String[] args) {
for (int i = 0; i < 50000; i++)
System.out.println(i + "--" + NumToStr(i) + "--" + StrToNum(NumToStr(i)));
}
}