短链接算法收集与分析

简介: 短链接就不说了,大家已经都清楚了,如下所示就是短链接: 新浪微博     http://t.cn/SVpONM 腾讯微博     http://url.cn/302yor Yun.io         http://d.yun.io/PNri2v 短链接的好处:1、内容需要;2、用户友好;3、便于管理。

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

新浪微博     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 实现方式

相关文章
|
7天前
|
数据采集 机器学习/深度学习 算法
|
3天前
|
人工智能 算法 BI
第一周算法设计与分析 D : 两面包夹芝士
这篇文章介绍了解决算法问题"两面包夹芝士"的方法,通过找出两个数组中的最大最小值,计算这两个值之间的整数个数,包括特判不存在整数的情况。
|
3天前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
16天前
|
算法 Java 测试技术
算法分析(蛮力法与减治算法应用实验报告)
这篇文章是关于算法分析的实验报告,介绍了如何使用蛮力法解决背包问题,并通过伪代码和Java代码实现,同时分析了其时间效率;还介绍了基于减治法思想实现的二叉查找树的插入与查找,同样提供了伪代码、Java源代码实现和时间效率分析,最后展示了测试结果截图。
算法分析(蛮力法与减治算法应用实验报告)
|
3天前
|
人工智能 算法
第一周算法设计与分析:C : 200和整数对之间的情缘
这篇文章介绍了解决算法问题"200和整数对之间的情缘"的方法,通过统计数组中每个数模200的余数,并计算每个同余类中数的组合数来找出所有满足条件的整数对(i, j),使得\( A_i - A_j \)是200的整数倍。
|
23天前
|
机器学习/深度学习 数据采集 算法
【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现
本文介绍了一个基于Python的时间序列模型,用于分析和预测2021-2022年重庆地区的气温变化趋势,通过ARIMA和LSTM模型的应用,揭示了气温的季节性和趋势性变化,并提供了对未来气温变化的预测,有助于气象预报和相关决策制定。
【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现
|
3天前
|
人工智能 算法
第一周算法设计与分析 G : 排队援救
这篇文章介绍了解决算法问题"排队援救"的方法,通过使用队列和映射来模拟救援点的排队过程,并确定最终得到救援的人的顺序和编号。
|
3天前
|
算法 C++
第一周算法设计与分析 E : 构造回文串
这篇文章介绍了解决算法问题"构造回文串"的方法,即判断给定的整数N(视为字符串)是否可以通过在前面添加任意个0(或不添加)来构造一个回文串,并给出了相应的C++代码实现。
|
14天前
|
机器学习/深度学习 人工智能 算法
【人工智能】传统语音识别算法概述,应用场景,项目实践及案例分析,附带代码示例
传统语音识别算法是将语音信号转化为文本形式的技术,它主要基于模式识别理论和数学统计学方法。以下是传统语音识别算法的基本概述
32 2
|
16天前
|
机器学习/深度学习 存储 算法
算法时间复杂度分析
这篇文章讲解了如何分析算法的时间复杂度,包括关注循环执行次数最多的代码段、总复杂度的确定、嵌套代码复杂度的计算方法,并提供了大O阶的推导步骤和常见时间复杂度的列表,同时还介绍了空间复杂度的概念及其重要性。

热门文章

最新文章

下一篇
云函数