看了网上的短网址算法,表示很有意思,其中最中意的还是永远不重复的短网址算法。
步骤:
1,准备一个被打乱的数组,存放A-Za-Z0-9这62个字符
2.预先产生一个网址ID,将这个ID通过 _10_to_62 解析转换成62进制的短网址符。
3.存储ID,短网址code,页面URL
算法如下,很简单,时间效率也比较高,甚至,有了存储的ID,要不要存储短网址code都无所谓,
这个算法时间复杂度本来就是n,而一般的短网址长度也就1~7位,时间复杂度也可以算作O(1)常量了。import java.util.Stack;
/**
* @author Administrator
*
*/
public class Main {
public static void main(String[] args) {
System.out.println(36526445);
System.out.println(_10_to_62(36526445));
System.out.println(_62_to_10(_10_to_62(36526445)));
}
public static final char[] array={'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m','0','1','2','3','4','5','6','7','8','9','Q','W','E','R','T','Y','U','I','O','P','A','S','D','F','G','H','J','K','L','Z','X','C','V','B','N','M'};
public static String _10_to_62(long number){
Long rest=number;
Stack<Character> stack=new Stack<Character>();
StringBuilder result=new StringBuilder(0);
while(rest!=0){
stack.add(array[new Long((rest-(rest/62)*62)).intValue()]);
rest=rest/62;
}
for(;!stack.isEmpty();){
result.append(stack.pop());
}
return result.toString();
}
public static long _62_to_10(String sixty_str){
int multiple=1;
long result=0;
Character c;
for(int i=0;i<sixty_str.length();i++){
c=sixty_str.charAt(sixty_str.length()-i-1);
result+=_62_value(c)*multiple;
multiple=multiple*62;
}
return result;
}
private static int _62_value(Character c){
for(int i=0;i<array.length;i++){
if(c==array[i]){
return i;
}
}
return -1;
}
}