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 相关文章推荐
安装APACHE
Jan 15 PHP
php读取数据库信息的几种方法
May 24 PHP
PHP 文件编程综合案例-文件上传的实现
Jul 03 PHP
php中explode函数用法分析
Nov 15 PHP
在Nginx上部署ThinkPHP项目教程
Feb 02 PHP
php获取网页里所有图片并存入数组的方法
Apr 06 PHP
php自定义类fsocket模拟post或get请求的方法
Jul 31 PHP
PHP翻页跳转功能实现方法
Nov 30 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
Sep 13 PHP
PHP autoload使用方法及步骤详解
Sep 05 PHP
PHP操作Redis常用命令的实例详解
Dec 23 PHP
php png失真的原因及解决办法
Oct 24 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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
德劲1103二次变频版的打磨
2021/03/02 无线电
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
2021/03/09 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
javascript 节点排序 2
2011/01/31 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
wxPython使用系统剪切板的方法
2015/06/16 Python
python 内置函数filter
2017/06/01 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
python+flask实现API的方法
2018/11/21 Python
python如何制作缩略图
2019/04/30 Python
python验证身份证信息实例代码
2019/05/06 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
《窗前的气球》教学反思
2014/04/07 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
win10更新失败无限重启解决方法
2022/04/19 数码科技