短网址功能实现

来源:互联网 发布:寻找客户的软件 编辑:程序博客网 时间:2024/05/01 15:42
先来看看短网址映射算法的理论(网上找到的资料)

1)将长网址md5生成32位签名串,分为4段, 每段8个字节; 
2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理; 
3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串; 
4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;

Java代码如下:

import java.security.GeneralSecurityException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class ToolBox {public static void main(String args[]) throws GeneralSecurityException {String url="http://hi.baidu.com";String shorturl = shortUrl(url);System.out.println("short url selected: " + shorturl);}public static String shortUrl(String url) throws NoSuchAlgorithmException {//可以自定义生成MD5加密字符传前的混合KEY String key = "Leejor"; //要使用生成URL的字符 String[] chars = new String[]{ "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; //创建具有指定算法名称的信息摘要     MessageDigest md = MessageDigest.getInstance("MD5");     //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算     byte[] results = md.digest(url.getBytes());     //将得到的字节数组变成字符串    StringBuffer resultString = new StringBuffer(100);    for(int i=0; i<results.length; i++) {    int x = results[i] + 128;    resultString.append(chars[x & 0x0F]);    resultString.append(chars[x >> 4]);    }//    System.out.println(resultString.toString());//    System.out.println(resultString.length());    for(int i=0; i<4; i++) {    long hexint = 0x3FFFFFFF & Long.valueOf(resultString.substring(i*8, i*8+8), 16);    StringBuffer shorturl=new StringBuffer(6);    for(int j=0; j<6; j++) {    long index = 0x0000003D & hexint;    shorturl.append(chars[(int) index]);    hexint = hexint >> 5;    }//    System.out.println("short url " + i +": " + shorturl.toString());    //如果shorturl与现有的其他短网址不冲突,则返回    return shorturl.toString();    }    //如果都冲突,就返回空值return null;}}