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技术订阅号

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法与Python学习

Python再次更新! 解锁与优化多项新特性......

Python 3.7.0 版本于 6 月 27 号正式发布,该版本有多项重大的更新和改进,主要内容如下如下:

1070
来自专栏喔家ArchiSelf

全栈Python 编程必备

Python作为一种编程语言,被称为“胶水语言”,更被拥趸们誉为“最美丽”的编程语言,从云端到客户端,再到物联网终端,无所不在,同时还是人工智能优选的编程语言。

3635
来自专栏奇点大数据

用python做科学计算之pandas入门简介

pandas是一个开源的python数据分析和处理包,使用灵活方便,性能高,速度快,简单介绍一下它里面比较常用的功能 数据读取 它支持多种数据读取的方式这里简...

2886
来自专栏北京马哥教育

Python入门教程:超详细1小时学会Python

1.Hello world 安装完Python之后,打开IDLE(Python GUI) ,该程序是Python语言解释器,你写的语句能够立即运行。 我们写下...

4485
来自专栏小灰灰

动手实现MVC: 3. AOP实现准备篇动态代理

背景 在实现AOP功能时,必然扰不开代理模式,所以在此之前,先准备下代理模式相关知识点 代理 关于代理,主要需要注意以下几个点 什么是代理模式 为什么要用代理 ...

1757
来自专栏用户2442861的专栏

最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

http://blog.csdn.net/lanxuezaipiao/article/details/24845625

7992
来自专栏海说

深入理解计算机系统(3.2)---数据格式、访问信息以及操作数指示符

  本文的内容其实可以成为汇编语言的基础,因为汇编语言大部分时候是在操作一些我们平时开发看不到的东西,因此本文的目的就是搞清楚,汇编语言都是在操作些什么东西。或...

1274
来自专栏FreeBuf

pwnable.tw刷题之dubblesort

前言 上一篇中我介绍了phttp://www.freebuf.com/articles/others-articles/134271.htmlwnable.tw...

3216
来自专栏python学习路

二、Python介绍

Python 是一门什么样的语言? python是一门动态解释性的强类型定义语言。 编程语言主要从以下几个角度为进行分类,编译型和解释型、静态语言和动态语言、...

3574
来自专栏程序员与猫

Go Code Review Comments 译文(截止2018年7月27日)

持续更新中… 原文最新链接 https://github.com/golang/go/wiki/CodeReviewComments/5a40ba36d38...

1423

扫码关注云+社区

领取腾讯云代金券