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 相关文章推荐
Oracle 常见问题解答
Oct 09 PHP
解析thinkphp中的M()与D()方法的区别
Jun 22 PHP
简单的php中文转拼音的实现代码
Feb 11 PHP
基于递归实现的php树形菜单代码
Nov 19 PHP
php+ajax实现的点击浏览量加1
Apr 16 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
CI映射(加载)数据到view层的方法
Mar 28 PHP
php封装单文件上传到数据库(路径)
Oct 15 PHP
PHP连接MySQL数据库并以json格式输出
May 21 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 PHP
Yii2语言国际化的配置教程
Aug 19 PHP
laravel框架使用阿里云短信发送消息操作示例
Feb 15 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
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
详解PHP中的 input属性(隐藏 只读 限制)
2017/08/14 PHP
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
利用Javascript实现BMI计算器
2016/08/16 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
在python中pandas的series合并方法
2018/11/12 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
大学考试作弊检讨书
2014/01/30 职场文书
土建专业大学生自荐信范文
2014/04/09 职场文书
党风廉政建设责任书
2014/04/14 职场文书
植物生产学专业求职信
2014/08/08 职场文书
内乡县衙导游词
2015/02/05 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
初中体育课教学反思
2016/02/16 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers