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

相关文章

来自专栏猿湿Xoong

一个bit一个bit的进行 Base64 白话科普,看不懂算你输

784
来自专栏Linyb极客之路

Java开发之jdk命令行工具详解

由于java jdk命令行工具比较重要,加之看到一篇不错的总结,所以接下来详细讲解。

1044
来自专栏老九学堂

老九学堂第二讲:编写第一个Java程序【原创】

第二讲涉及到的知识点 1Java的运行机制 2Java程序的结构 3熟悉Eclipse开发环境 回顾一下老九君讲的,还记得吗?Java源文件是以后缀为.jav...

3425
来自专栏mathor

LeetCode410. 分割数组的最大值

 这道题看着好像没什么思路,但其实可以利用二分法来做,二分法中的mid就是最终要返回的值,也就代表着子数组的和最小的值  我们首先还是设置左右区间,左区...

803
来自专栏Python中文社区

Python云计算框架:OpenStack源码分析之RabbitMQ(二)

之前发布的文章因为在编辑后代码部分在手机上看不清已被及时删除,本文重新编辑好之后再发布一次,带来不便请谅解! 專 欄 ❈ ZZR,Python中文社区专栏作者...

1979
来自专栏java学习

Java每日一练(2017/6/22)

Java基础 | 数据库 | Android | 学习视频 | 学习资料下载 最新通知 ●回复"每日一练"获取以前的题目! ●【新】Ajax知识点视频更新了!(...

31912
来自专栏Spark学习技巧

Hive高级优化

1,FetchTask 不执行mapreduce,提高速度 设置的三种方式: 方法一: set hive.fetch.task.conversion=mo...

2977
来自专栏吉浦迅科技

DAY36:阅读”执行空间&扩展修饰符

1103
来自专栏涂小刚的专栏

从 PageRank Example 谈 Spark 应用程序调优

在做PageRank测试时,发现有很多有趣的调优点,想到这些调优点可能对用户来说是普遍有效的,现把它整理出来一一分析,以供大家参考。

7743
来自专栏皮振伟的专栏

[linux][memory]hugetlb和hugepage技术分析

前言: 乍一看,hugetlb和hugepage还挺像的,好像都是所谓的“大页”。然而,却很难说出来它们的差异。作者也是花了写时间翻翻代码,写了几个测试的例子,...

3507

扫描关注云+社区