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 相关文章推荐
模拟flock实现文件锁定
Feb 14 PHP
php使浏览器直接下载pdf文件的方法
Nov 15 PHP
php socket实现的聊天室代码分享
Aug 16 PHP
php读取文件内容到数组的方法
Mar 16 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
PHP 二维数组和三维数组的过滤
Mar 16 PHP
Smarty变量用法详解
May 11 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
PHP读书笔记整理_结构语句详解
Jul 01 PHP
Smarty日期时间操作方法示例
Nov 15 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 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中使用反射技术的架构插件使用说明
2010/05/18 PHP
php动态实现表格跨行跨列实现代码
2012/11/06 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
告诉大家什么是JSON
2008/06/10 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
使用vue2实现购物车和地址选配功能
2018/03/29 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
深入理解python中的atexit模块
2017/03/07 Python
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
Python如何进行时间处理
2020/08/06 Python
Django admin组件的使用
2020/10/24 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
猫咪家具:CatsPlay
2018/11/03 全球购物
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
大学生求职意向书
2015/05/11 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
代码解析React中setState同步和异步问题
2021/06/03 Javascript
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
python计算列表元素与乘积详情
2022/08/05 Python