微博短链接算法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 相关文章推荐
VFP与其他应用程序的集成
Oct 09 PHP
PHP Ajax实现页面无刷新发表评论
Jan 02 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
Feb 10 PHP
php操作xml入门之cdata区段
Jan 23 PHP
详解YII关联查询
Jan 10 PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 PHP
php实现带读写分离功能的MySQL类完整实例
Jul 28 PHP
Zend Framework常用校验器详解
Dec 09 PHP
PHP操作Redis常用技巧总结
Apr 24 PHP
Laravel5.7 Eloquent ORM快速入门详解
Apr 12 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 03 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 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
实用函数2
2007/11/08 PHP
php开发环境配置记录
2011/01/14 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
javascript prototype 原型链
2009/03/12 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
assert()函数用法总结(推荐)
2017/01/25 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
如何将HTML字符转换为DOM节点并动态添加到文档中详解
2018/08/19 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
vue登录注册实例详解
2019/09/14 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
Python 点击指定位置验证码破解的实现代码
2019/09/11 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
巴西电子、家电、智能手机购物网站:Girafa
2019/06/04 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
医学院四年学习生活的自我评价
2013/11/06 职场文书
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
共青团员自我评价范文
2014/09/14 职场文书
个人自查自纠材料
2014/10/14 职场文书
情感电台广播稿
2015/08/18 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
Go语言基础知识点介绍
2021/07/04 Golang
Apache自带的ab压力测试工具的实现
2022/07/23 Servers