短链接算法收集与分析

短链接就不说了,大家已经都清楚了,如下所示就是短链接:

新浪微博     http://t.cn/SVpONM

腾讯微博     http://url.cn/302yor

Yun.io         http://d.yun.io/PNri2v

短链接的好处:1、内容需要;2、用户友好;3、便于管理。

如何实现呢,大概有三个步骤:

1、定义一个URL映射算法,可以将长的URL映射成短字符串;

2、使用一个存储(数据库?NoSQL?)来存储完成的映射;

3、实现自己的URL映射算法;

一般来说,第三步是我们比较头疼的,如何将一个长的URL字符串,映射成一个较短的字符串呢。我总结了三种办法:

普通实现

我想以前大家学习过十进制和二进制的互相转换,或者十进制和十六进制的互相转换,那么为了更短,我们可以使用62进制,对于一个数字ID进行转码,转换成一个短字符串。

这种做法的缺点是没有办法保证所有链接都是固定的位数的长度,而且在高并发的情况下,如何保证能够快速分发是个问题。

具体实现方法:

    /**
     * 利用62进制对数字ID进行短链接编码,缺点不能保证每个短链接是固定长度
     *
     * @author  wanshiqiang<wangshiqiang@360.cn>
     * @param integer $integer
     * @param string $base
     */
    private function getShortenedURLFromID ($integer, $base = ALLOWED_CHARS)
    {  
        $length = strlen($base);
        while($integer > $length - 1)
        {  
            $out = $base[fmod($integer, $length)] . $out;
            $integer = floor( $integer / $length );
        }  
        return $base[$integer] . $out;
    }  
    /**
     * 对62进制编码的短链接进行解码
     *
     * @author  wangshiqiang<wangshiqiang@360.cn>
     * @param string $string
     * @param string $base
     */
    private function getIDFromShortenedURL ($string, $base = ALLOWED_CHARS)
    {  
        $length = strlen($base);
        $size = strlen($string) - 1;
        $string = str_split($string);
        $out = strpos($base, array_pop($string));
        foreach($string as $i => $char)
        {  
            $out += strpos($base, $char) * pow($length, $size - $i);
        }  
        return $out;
    }

文艺实现

算法描述:使用6个字符来表示短链接,我们使用ASCII字符中的'a'-'z','0'-'5',共计32个字符做为集合。每个字符有32种状态,六个字符就可以表示32^6(1073741824),那么如何得到这六个字符,描述如下:

对传入的长URL进行Md5,得到一个32位的字符串,这个字符串变化很多,是16的32次方,基本上可以保证唯一性。将这32位分成四份,每一份8个字符,这时机率变成了16的8次方,是4294967296,这个数字碰撞的机率也比较小啦,关键是后面的一次处理。我们将这个8位的字符认为是16进制整数,也就是1*('0x'.$val),然后取0-30位,每5个一组,算出他的整数值,然后映射到我们准备的32个字符中,最后就能够得到一个6位的短链接地址。

PHP实现如下:

function shorten( $long_url )
{
     $base32 = "abcdefghijklmnopqrstuvwxyz012345";
     $hex = md5( $long_url );
     $hexLen = strlen( $hex );
     $subHexLen = $hexLen / 8;
     $output = array();
     for( $i = 0; $i < $subHexLen; $i++ )
     {
          $subHex = substr( $hex, $i * 8, 8 );
          $subHex = 0x3FFFFFFF & ( 1 * ('0x' . $subHex ) );

    $out = ''; 

          for( $j = 0; $j < 6; $j++ )
          {
               $val = 0x0000001F & $int;
               $out .= $base32[$val];
               $int = $int >> 5;
          }
          $output[] = $out;
     }
     return $output;
}

二逼实现

下面这个函数使用了纯随机的方式来生成一个短链接,虽然我们可以通过查询操作来确保不重复使用短链接,可是... 这样真的靠谱吗~~

function random($length, $pool = '') {
     $random = '';
     if (empty($pool)) { $pool    = 'abcdefghkmnpqrstuvwxyz'; $pool   .=
     '23456789'; }
     srand ((double)microtime()*1000000);
     for($i = 0; $i < $length; $i++) { $random .=
     substr($pool,(rand()%(strlen ($pool))), 1); }
     return $random;
}

Technorati 标签: 短链接,Short Url,映射,哈希

参考资料:

1、微博短地址原理解析

2、微博短域名原理及作用

3、Yours.org

4、Free PHP URL Shorten script that kicks ass

5、PHP Short Url Algorithm Implementation

6、Implement your own short URL

7、短网址算法初步汇总

8、Short Url 实现方式

时间: 2024-10-27 04:00:03

短链接算法收集与分析的相关文章

php 短链接算法收集与分析_php技巧

短链接就不说了,大家已经都清楚了,如下所示就是短链接: 新浪微博 http://t.cn/SVpONM 腾讯微博 http://url.cn/302yor Yun.io http://d.yun.io/PNri2v 短链接的好处:1.内容需要:2.用户友好:3.便于管理. 如何实现呢,大概有三个步骤: 1.定义一个URL映射算法,可以将长的URL映射成短字符串: 2.使用一个存储(数据库?NoSQL?)来存储完成的映射: 3.实现自己的URL映射算法: 一般来说,第三步是我们比较头疼的,如何将一

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='

微博短链接算法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='

微博短链接算法php版本实现代码_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=''

ASP.NET通过第三方网站Bitly实现短链接地址程序_实用技巧

发微博很久了,或许是我之前没注意,现在特别关注那个微博中的图片链接和URL链接,总给我看不懂但是又那么短的感觉,反正不是我上传的地址,其实这里使用一个短链接服务功能,这里拿出来晒晒. 这里看看是指向淘宝的一个商品页面,链接地址是这样的 ,但是现在在微博中变成了红圈表名的那个样子,似乎看不懂了,而且你点击之后还是到你原有的页面.这里就是使用了短链接程序服务,包括图片等等都是这样,可以缩短url长度. Bitly 是世界上最流行的短链接服务,而且已经免费开放所有功能.点击访问官网 Bitly.com

很牛逼的短链接,我们一起来晒晒短链接程序

发微博很久了,或许是我之前没注意,现在特别关注那个微博中的图片链接和URL链接,总给我看不懂但是又那么短的感觉,反正不是我上传的地址,其实这里使用一个短链接服务功能,这里拿出来晒晒.    这里看看是指向淘宝的一个商品页面,链接地址是这样的 ,但是现在在微博中变成了红圈表名的那个样子,似乎看不懂了,而且你点击之后还是到你原有的页面.这里就是使用了短链接程序服务,包括图片等等都是这样,可以缩短url长度.  Bitly 是世界上最流行的短链接服务,而且已经免费开放所有功能.点击访问官网 Bitly

常用排序算法比较与分析

 一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见

实例介绍网络数据收集与分析的方法和要点

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 数据的收集与分析是从事互联网相关工作人员的必备技能,小到个人站长,大到行业集团决策者,在作任何一个选择与决策的时候,都是以数据作基础与支撑,面对 互联网的各种数据繁杂多变,如何做好数据的收集,整理与分析工作呢,下面笔者以个人的实际操作的案例来详细说一下数据的收集与分析的要点,供大家参考! (笔者要收集的是活跃的人气地方论坛) 1.明确收集数据

从汽车网站着手谈数据收集与分析要点

中介交易 SEO诊断 淘宝客 云主机 技术大厅 数据分析,顾名思义,即数据+分析.也就是说必须要以数据为先,分析为后."不以数据分析为基础的执行都是耍流氓".对收集来的大量第一手资料和第二手资料进行分析,以求最大化地开发数据资料的功能,发挥数据的作用,是我们数据收集的最终目的. 前段时间专门做了一个关于汽车行业网站的数据收集与分析,做的不是很好,但在这个过程中我收获到了很多.在这里毛梦姣重新总结一下做数据收集与分析的过程中应该注意的要点. 一.明确数据收集与分析的目的 目的通常是指行为