微博短链接算法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 相关文章推荐
第十一节--重载
Nov 16 PHP
php设置编码格式的方法
Mar 05 PHP
测试php连接mysql是否成功的代码分享
Jan 24 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
Nov 15 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
Yii隐藏URL中index.php的方法
Jul 12 PHP
php外部执行命令函数用法小结
Oct 11 PHP
PHP 常用时间函数资料整理
Oct 22 PHP
PHP数据分析引擎计算余弦相似度算法示例
Aug 08 PHP
PHP实现的回溯算法示例
Aug 15 PHP
thinkPHP5框架自定义验证器实现方法分析
Jun 11 PHP
Django 标签筛选的实现代码(一对多、多对多)
Sep 05 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
中国收音机工业发展史
2021/03/02 无线电
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
PHP中“=&gt;
2019/03/01 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
google地图的路线实现代码
2009/08/20 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
javascript preload&amp;lazy load
2010/05/13 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
2017/07/11 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
vue实现微信获取用户信息的方法
2019/03/21 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
Python中的单继承与多继承实例分析
2018/05/10 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
网络编辑岗位职责
2014/03/18 职场文书
部门活动策划方案
2014/08/16 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书
党校党性分析材料
2014/12/19 职场文书
学校开除通知书
2015/04/25 职场文书
工作感言一句话
2015/08/01 职场文书
技术入股协议书
2016/03/22 职场文书
python基础之while循环语句的使用
2021/04/20 Python
P站美图推荐——变身女主角特辑
2022/03/20 日漫