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 相关文章推荐
在线短消息收发的程序,不用数据库
Oct 09 PHP
PHP操作mysql函数详解,mysql和php交互函数
May 19 PHP
PHP filter_var() 函数 Filter 函数
Apr 25 PHP
php阻止页面后退的方法分享
Feb 17 PHP
PHP跨平台获取服务器IP地址自定义函数分享
Dec 29 PHP
PHP实现动态执行代码的方法
Mar 25 PHP
php外部执行命令函数用法小结
Oct 11 PHP
php提交表单时保留多个空格及换行的文本样式的方法
Jun 20 PHP
PHP获取数组中指定的一列实例
Dec 27 PHP
Laravel框架实现超简单的分页效果示例
Feb 08 PHP
PHP实现字符串的全排列详解
Apr 24 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
Mar 03 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(1) php开发环境配置
2010/02/15 PHP
php 的反射详解及示例代码
2016/08/25 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
鼠标经过显示二级菜单js特效
2013/08/13 Javascript
Json序列化和反序列化方法解析
2013/12/19 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
幼儿园教育教学反思
2014/01/31 职场文书
华山导游词
2015/02/03 职场文书
费城故事观后感
2015/06/10 职场文书
致运动员加油稿
2015/07/21 职场文书
客户答谢会致辞
2015/07/30 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript