• 短链接的生成算法


    新浪微博短链接的生成算法(Java版本)
    最近看到微博的短链接真是很火啊,新浪、腾讯、搜狐等微博网站都加入了短链接的功能。之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少。短链接的主要职责就是把原始链接很长的地址压缩成只有6 个字母的短链接地址,当我们点击这6 个字母的链接后,我们又可以跳转到原始链接地址。
    开始以为短链接是按照某种算法把原始链接压缩为短链接,再根据算法从短链接反算成原始链接的。后来尝试了下压缩算法(gzip 压缩算法),发现对于url 这种字符串越是压缩,长度就越长。通过对压缩算法的一些了解,发现靠压缩算法来实现这个功能不太靠谱。
    后来在网上找到一个生成算法,该算法主要使用MD5 算法对原始链接进行加密(这里使用的MD5 加密后的字符串长度为32 位),然后对加密后的字符串进行处理以得到短链接的地址。原始的算法是C# 版本的,这里我把该算法修改成Java 版本的. 算法的具体代码如下,代码中有注释:
    一、  代码
    package com.csdn.shorturl;
    public class ShortUrlGenerator {
     
        /**
          * @param args
          */
        public static void main(String[] args) {
           // 长连接: http://tech.sina.com.cn/i/2011-03-23/11285321288.shtml
           // 新浪解析后的短链接为: http://t.cn/h1jGSC
           String sLongUrl = "http://tech.sina.com.cn/i/2011-03-23/11285321288.shtml" ; // 3BD768E58042156E54626860E241E999
           String[] aResult = shortUrl (sLongUrl);
           // 打印出结果
           for ( int i = 0; i < aResult. length ; i++) {
               System. out .println( "[" + i + "]:::" + aResult[i]);
           }
        }
     
        public static String[] shortUrl(String url) {
           // 可以自定义生成 MD5 加密字符传前的混合 KEY
           String key = "wuguowei" ;
           // 要使用生成 URL 的字符
           String[] chars = new String[] { "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" , "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"
     
           };
           // 对传入网址进行 MD5 加密
           String sMD5EncryptResult = ( new CMyEncrypt()).getMD5OfStr(key + url);
           String hex = sMD5EncryptResult;
     
           String[] resUrl = new String[4];
           for ( int i = 0; i < 4; i++) {
     
               // 把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算
               String sTempSubString = hex.substring(i * 8, i * 8 + 8);
     
               // 这里需要使用 long 型来转换,因为 Inteper .parseInt() 只能处理 31 位 , 首位为符号位 , 如果不用 long ,则会越界
               long lHexLong = 0x3FFFFFFF & Long.parseLong (sTempSubString, 16);
               String outChars = "" ;
               for ( int j = 0; j < 6; j++) {
                  // 把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引
                  long index = 0x0000003D & lHexLong;
                  // 把取得的字符相加
                  outChars += chars[( int ) index];
                  // 每次循环按位右移 5 位
                  lHexLong = lHexLong >> 5;
               }
               // 把字符串存入对应索引的输出数组
               resUrl[i] = outChars;
           }
           return resUrl;
        }
    }
     
    二、  输出结果
    执行上面代码的结果如下,会产生4 组6 位字符串,任意一组都可以作为当前字符串的短链接地址。
    [0]:::7nUFJn
    [1]:::f6Zzy2
    [2]:::j6jmQb
    [3]:::2eAjea
     
     
    三、  跳转原理
    当我们生成短链接之后,只需要在表中(数据库或者NoSql )存储原始链接与短链接的映射关系即可。当我们访问短链接时,只需要从映射关系中找到原始链接,即可跳转到原始链接。

    FROM: http://hi.baidu.com/aiguozhedaodan/item/7bd7493db9801ebf124b1407

    微博短链接算法PHP版本
     思路:
    
      1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
    
      2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
    
      3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
    
      4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;
    
      下面是PHP代码:
    
    function shorturl($url='', $prefix='', $suffix='') {
    $base32 = array (
    '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', '0', '1', '2', '3', '4', '5');
    
    $hex = md5($prefix.$url.$suffix);
    $hexLen = strlen($hex);
    $subHexLen = $hexLen / 8;
    $output = array();
    
    for ($i = 0; $i < $subHexLen; $i++) {
    $subHex = substr ($hex, $i * 8, 8);
    $int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
    $out = '';
    for ($j = 0; $j < 6; $j++) {
    $val = 0x0000001F & $int;
    $out .= $base32[$val];
    $int = $int >> 5;
    }
    $output[] = $out;
    }
    return $output;
    }
    
    $urls = shorturl('http://www.php100.com');
    var_dump($urls);

    FROM: http://blog.sina.com.cn/s/blog_700e11ff01010i1j.html

  • 相关阅读:
    一个好的时间函数
    Codeforces 785E. Anton and Permutation
    Codeforces 785 D. Anton and School
    Codeforces 510 E. Fox And Dinner
    Codeforces 242 E. XOR on Segment
    Codeforces 629 E. Famil Door and Roads
    Codeforces 600E. Lomsat gelral(Dsu on tree学习)
    Codeforces 438D The Child and Sequence
    Codeforces 729E Subordinates
    【ATcoder】D
  • 原文地址:https://www.cnblogs.com/blogsme/p/3398844.html
Copyright © 2020-2023  润新知