URL短链接实现方法

最近项目开发中,需要实现URL长链接转短链接的需求,于是在网上找了一些资料,顺便整理了下,欢迎有想法的童鞋踊跃留言,我们共同探讨。

一.短链接的好处

1.内容需要(比如短信,微博中链接字数的限制)

2.便于管理(方便后台跟踪点击量,便于统计)

3.用户友好(看起来很Cool,提升用户体验)

大致思路是定义一个URL映射算法,将长的URL映射到短的URL,使用数据库或者redis缓存存储映射关系,实现映射算法。其中关键部分在于映射算法,接下来我们就详细说下映射算法。

二.映射算法

1.进制转化

多数方案是使用不同进制进行相互转换,比如十进制转十六进制,十进制转六十二进制,即使我们记录了一亿条数据,一亿的64进制为F9eEa同样适合做短链接的参数,将自增长的ID转化为短链接的字符串,长链接短链接以key,value的映射关系存储到数据库或者缓存中,为了更方便的存取。

缺点:没有办法保证转化的短链接字符串的长度,在高并发的情况下,如何保证能够快速分发是个问题。

2.固定算法

我们使用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位的短链接地址。

代码如下:

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; }

网友小强:

实际上他们不会这样去实现的,要考虑效率。 正规做法应该是hash检验+id计数器+平衡树查找。 如果hash算法设计的巧妙,可以省略id计数器。

网友二狗:

对长网址进行sha1生成的hash值存入hashtable或者redis,在缩短之前进行hash值比对,如果相同就查询出之前生成的短码即可。

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2017-11-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏文渊之博

PowerBI 引入时间智能

简介 Power BI Desktop -是一款由微软发布的自助式商业智能工具,功能强大、易于使用。其中还可以通过微软云连多个数据源并且使用数据源来创建可视化表...

2499
来自专栏懒人开发

(1.1)James Stewart Calculus 5th Edition:Four Ways to Represent a Function

一个曲线,在竖直方向,如果对应的一个x值和曲线相交不止一次,就不是一个函数。(其实可以理解成,上面说的,每个 A集合的元素,都有且有一个B集合中的元素和他对应)

713
来自专栏更流畅、简洁的软件开发方式

分页解决方案 之 QuickPager的使用方法(PostBack分页、自动获取数据)

      适用范围:网站后台管理、OA、CRM、CMS等,从关系型数据库里提取数据,愿意使用Pager_SQL、DataAccessLibrary的情况。  ...

1965
来自专栏C语言及其他语言

【每日一题】问题1075: 台球碰撞(此次问题较难)

题目描述 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形。有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球...

2585
来自专栏Windows Community

Windows 8.1 应用再出发 - 几种布局控件

本篇为大家介绍Windows 商店应用中几种布局控件的用法。分别是Canvas、Grid、StackPanel 和 VariableSizedWrapGrid。...

3157
来自专栏PHP技术

URL短链接实现方法

最近项目开发中,需要实现URL长链接转短链接的需求,于是在网上找了一些资料,顺便整理了下,欢迎有想法的童鞋踊跃留言,我们共同探讨。

2198
来自专栏数据结构与算法

cf1027F. Session in BSU(并查集 匈牙利)

$n$个人,每个人可以在第$a_i$天或第$b_i$,一天最多考一场试,问在最优的情况下,最晚什么时候结束

881
来自专栏数据小魔方

R语言数据清洗实战——高效list解析方案

list是R语言中包容性最强的数据对象,几乎可以容乃所有的其他数据类型。 但是包容性最强也也意味着他对于内部子对象的类型限制最少,甚至内部可以存在递归结构,这样...

3584
来自专栏小詹同学

Leetcode打卡 | No.010 正则表达式匹配

欢迎和小詹一起定期刷leetcode,每周一和周五更新一题,每一题都吃透,欢迎一题多解,寻找最优解!这个记录帖哪怕只有一个读者,小詹也会坚持刷下去的!

1014
来自专栏人工智能LeadAI

拼图游戏和它的AI算法

写了个拼图游戏,探讨一下相关的AI算法。拼图游戏的复原问题也叫做N数码问题。 拼图游戏 N数码问题 广度优先搜索 双向广度优先搜索 A*搜索 游戏设定 实现一个...

46011

扫码关注云+社区