php 短链接算法收集与分析


Posted in PHP onDecember 30, 2011

短链接就不说了,大家已经都清楚了,如下所示就是短链接:
新浪微博 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 实现方式

PHP 相关文章推荐
PHP新手上路(三)
Oct 09 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
Sep 15 PHP
PHP排序算法的复习和总结
Feb 15 PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
Aug 14 PHP
smarty模板中拼接字符串的方法
Feb 14 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
php网页病毒清除类
Dec 08 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
php中get_defined_constants函数用法实例分析
May 12 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 PHP
php 原生分页
Apr 01 PHP
php的大小写敏感问题整理
Dec 29 #PHP
php读取mysql乱码,用set names XXX解决的原理分享
Dec 29 #PHP
php站内搜索并高亮显示关键字的实现代码
Dec 29 #PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 #PHP
PHP防CC攻击实现代码
Dec 29 #PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 #PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
Dec 28 #PHP
You might like
PHP 操作文件的一些FAQ总结
2009/02/12 PHP
浅析php与数据库代码开发规范
2013/08/08 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
vue实现图片懒加载的方法分析
2020/02/05 Javascript
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
python编写简单端口扫描器
2019/09/04 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
使用Python解析Chrome浏览器书签的示例
2020/11/13 Python
EJB的几种类型
2012/08/15 面试题
安全教育演讲稿
2014/05/09 职场文书
教师自我剖析材料
2014/09/29 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
求职意向书范本
2015/05/11 职场文书
立案决定书范文
2015/06/24 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书