1、原理
生成一个唯一码、然后通过唯一码去数据库里查询真实的长链接地址
例如
https://www.sougit.com/article/2023?id=qsdkl7ff83dd47d8g3g021ddf
生成短链接的地址便是
https://www.sougit.com/Tmof387
如果嫌弃Tmof387太长了,可以修改array 增加他的长度 但是里面的字符必须唯一
public static void main(String[] args) {
long number = System.currentTimeMillis();
String decimalStr = numberConvertToDecimal(number, 62);
System.out.println(number + " 转换成 " + decimalStr);
// decimalStr = "s58g";
long toNumber = decimalConvertToNumber(decimalStr, 62);
System.out.println(decimalStr + " 转换成 " + toNumber);
}
public static char[] array = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
public static Map<Character, Integer> charValueMap = new HashMap<Character, Integer>();
//初始化map
static {
// Arrays.sort(array);
System.out.println(Arrays.toString(array));
for (int i = 0; i < array.length; i++) {
charValueMap.put(array[i], i);
}
}
/**
* 把数字转换成相对应的进制,目前支持(2-62)进制
*
* @param number
* @param decimal
* @return
*/
public static String numberConvertToDecimal(long number, int decimal) {
StringBuilder builder = new StringBuilder();
while (number != 0) {
builder.append(array[(int) (number - (number / decimal) * decimal)]);
number /= decimal;
}
return builder.reverse().toString();
}
/**
* 把进制字符串转换成相应的数字
*
* @param decimalStr
* @param decimal
* @return
*/
public static long decimalConvertToNumber(String decimalStr, int decimal) {
long sum = 0;
char[] chars = new StringBuilder(decimalStr).reverse().toString().toCharArray();
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if (charValueMap.containsKey(c) == false) {
return -1;
}
// decimal的i次方
sum += Math.pow(decimal, i) * charValueMap.get(c);
}
return sum;
}
获取该文章完整的git源码、请参考作者置顶文章。
文章校验码 u6y2