微博短链接算法php版本实现代码


Posted in PHP onSeptember 15, 2012

思路:
1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;
下面是PHP代码:

function shorturl($url='', $prefix='', $suffix='') { 
$base = array ( 
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 
'y', 'z', '0', '1', '2', '3', '4', '5'); 
$hex = md5($prefix.$url.$suffix); 
$hexLen = strlen($hex); 
$subHexLen = $hexLen / 8; 
$output = array(); 
for ($i = 0; $i < $subHexLen; $i++) { 
$subHex = substr ($hex, $i * 8, 8); 
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex)); 
$out = ''; 
for ($j = 0; $j < 6; $j++) { 
$val = 0x0000001F & $int; 
$out .= $base[$val]; 
$int = $int >> 5; 
} 
$output[] = $out; 
} 
return $output; 
} 
$urls = shorturl('https://3water.com/'); 
var_dump($urls);

结果
array(4) { 
[0]=> 
string(6) "alms1l" 
[1]=> 
string(6) "2ipmby" 
[2]=> 
string(6) "avo1hu" 
[3]=> 
string(6) "fdlban" 
}

另外一个版本:
function shorturl($url='', $prefix='', $suffix='') { 
$base = array( 
"a","b","c","d","e","f","g","h", 
"i","j","k","l","m","n","o","p", 
"q","r","s","t","u","v","w","x", 
"y","z","0","1","2","3","4","5", 
"6","7","8","9","A","B","C","D", 
"E","F","G","H","I","J","K","L", 
"M","N","O","P","Q","R","S","T", 
"U","V","W","X","Y","Z"); 
$hex = md5($prefix.$url.$suffix); 
$hexLen = strlen($hex); 
$subHexLen = $hexLen / 8; 
$output = array(); 
for ($i = 0; $i < $subHexLen; $i++) { 
$subHex = substr ($hex, $i * 8, 8); 
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex)); 
$out = ''; 
for ($j = 0; $j < 6; $j++) { 
$val = 0x0000003D & $int; 
$out .= $base[$val]; 
$int = $int >> 5; 
} 
$output[] = $out; 
} 
return $output; 
}

结果:
array(4) { 
[0] => 
string(6) "6jmMVj" 
[1] => 
string(6) "2EnIby" 
[2] => 
string(6) "6vIVfu" 
[3] => 
string(6) "B7Fb6n" 
}

但是升级版本碰撞率反而更高了,不知道为什么。
测试碰撞的测试代码:
$result = array(); 
$repeats= array(); 
$loop = 20000; 
for($i=0;$i<$loop;$i++){ 
$url = 'https://3water.com/?id='.$i; 
$shorta = shorturl($url); 
$short = $shorta[0]; 
if(in_array($short, $result)){ 
$repeats[] = $short; 
} 
$result[] = $short; 
} 
$result = array(); 
for($i=0;$i<$loop;$i++){ 
$url = 'https://3water.com/?id='.$i; 
$shorta = shorturl($url); 
$short = $shorta[0]; 
if(in_array($short, $repeats)){ 
$result[$short][] = $url; 
} 
} 
var_dump($repeats); 
var_dump($result);

结果:
array(8) { 
[0] => 
string(6) "3eQBzq" 
[1] => 
string(6) "uQFnay" 
[2] => 
string(6) "qEZbIv" 
[3] => 
string(6) "fMneYf" 
[4] => 
string(6) "FJj6Fr" 
[5] => 
string(6) "3Eviym" 
[6] => 
string(6) "j2mmuy" 
[7] => 
string(6) "jyQfIv" 
} 
array(8) { 
'jyQfIv' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=1640" 
[1] => 
string(27) "https://3water.com/?id=18661" 
} 
'fMneYf' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=2072" 
[1] => 
string(26) "https://3water.com/?id=8480" 
} 
'3eQBzq' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=4145" 
[1] => 
string(26) "https://3water.com/?id=4273" 
} 
'j2mmuy' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=7131" 
[1] => 
string(27) "https://3water.com/?id=17898" 
} 
'qEZbIv' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=7320" 
[1] => 
string(26) "https://3water.com/?id=8134" 
} 
'uQFnay' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=7347" 
[1] => 
string(26) "https://3water.com/?id=7962" 
} 
'FJj6Fr' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=8628" 
[1] => 
string(26) "https://3water.com/?id=9031" 
} 
'3Eviym' => 
array(2) { 
[0] => 
string(27) "https://3water.com/?id=11175" 
[1] => 
string(27) "https://3water.com/?id=14437" 
} 
}
PHP 相关文章推荐
需要注意的几个PHP漏洞小结
Feb 05 PHP
PHP 万年历实现代码
Oct 18 PHP
PHP基础之运算符的使用方法
Apr 28 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
浅谈php优化需要注意的地方
Nov 27 PHP
PHP实现事件机制实例分析
Jun 26 PHP
Yii模型操作之criteria查找数据库的方法
Jul 15 PHP
php登录超时检测功能实例详解
Mar 21 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
Aug 18 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
Jan 02 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
PHP优于Node.js的五大理由分享
Sep 15 #PHP
PHP的autoload机制的实现解析
Sep 15 #PHP
PHP中数组合并的两种方法及区别介绍
Sep 14 #PHP
PHP合并两个数组的两种方式的异同
Sep 14 #PHP
PHP数据流应用的一个简单实例
Sep 14 #PHP
分享一下贝贝成长进度的php代码
Sep 14 #PHP
PHP 之Section与Cookie使用总结
Sep 14 #PHP
You might like
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
php使用curl出现Expect:100-continue解决方法
2015/03/03 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
9个比较实用的php代码片段
2016/03/15 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
ie focus bug 解决方法
2009/09/03 Javascript
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
vue如何将v-for中的表格导出来
2018/05/07 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
浅析python中SQLAlchemy排序的一个坑
2017/02/24 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
详解Python 解压缩文件
2019/04/09 Python
WxPython实现无边框界面
2019/11/18 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
大学生咖啡店创业计划书
2014/01/21 职场文书
中药学自荐信
2014/06/15 职场文书
政府四风问题整改措施
2014/10/04 职场文书
生日寿星公答谢词
2015/09/29 职场文书
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫