微博短链接算法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生成WAP页面
Oct 09 PHP
《APMServ 5.1.2》使用图解
Oct 23 PHP
深入理解:XML与对象的序列化与反序列化
Jun 08 PHP
php+memcache实现的网站在线人数统计代码
Jul 04 PHP
php中动态修改ini配置
Oct 14 PHP
php实现TCP端口检测的方法
Apr 01 PHP
PHP的命令行命令使用指南
Aug 18 PHP
php实现购物车功能(上)
Jul 23 PHP
php 多文件上传的实现实例
Oct 23 PHP
Laravel5.7 Eloquent ORM快速入门详解
Apr 12 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 30 PHP
php设计模式之观察者模式定义与用法经典示例
Sep 19 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
PHP的栏目导航程序
2006/10/09 PHP
PHP中的CMS的涵义
2007/03/11 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
PHP实现合并discuz用户
2015/08/05 PHP
php实现点击可刷新验证码
2015/11/07 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
拖动时防止选中
2017/02/03 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
2018/12/29 jQuery
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
python pdb调试方法分享
2014/01/21 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
python 对key为时间的dict排序方法
2018/10/17 Python
Django REST framework视图的用法
2019/01/16 Python
python多进程并行代码实例
2019/09/30 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
保护环境建议书100字
2014/05/13 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
学校推普周活动总结
2015/05/07 职场文书
教导处教学工作总结
2015/08/12 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js