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 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2968
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2182
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2577
来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4064
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

3869
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

31810
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5476
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2782
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3145
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2546

扫码关注云+社区