微博短鏈接算法php版本實(shí)現(xiàn)代碼
更新時(shí)間:2012年09月15日 00:58:58 作者:
將長(zhǎng)網(wǎng)址md5生成32位簽名串,分為4段, 每段8個(gè)字節(jié)
思路:
1)將長(zhǎng)網(wǎng)址md5生成32位簽名串,分為4段, 每段8個(gè)字節(jié);
2)對(duì)這四段循環(huán)處理, 取8個(gè)字節(jié), 將他看成16進(jìn)制串與0x3fffffff(30位1)與操作, 即超過(guò)30位的忽略處理;
3)這30位分成6段, 每5位的數(shù)字作為字母表的索引取得特定字符, 依次進(jìn)行獲得6位字符串;
4)總的md5串可以獲得4個(gè)6位串; 取里面的任意一個(gè)就可作為這個(gè)長(zhǎng)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('http://www.dbjr.com.cn/');
var_dump($urls);
結(jié)果
array(4) {
[0]=>
string(6) "alms1l"
[1]=>
string(6) "2ipmby"
[2]=>
string(6) "avo1hu"
[3]=>
string(6) "fdlban"
}
另外一個(gè)版本:
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;
}
結(jié)果:
array(4) {
[0] =>
string(6) "6jmMVj"
[1] =>
string(6) "2EnIby"
[2] =>
string(6) "6vIVfu"
[3] =>
string(6) "B7Fb6n"
}
但是升級(jí)版本碰撞率反而更高了,不知道為什么。
測(cè)試碰撞的測(cè)試代碼:
$result = array();
$repeats= array();
$loop = 20000;
for($i=0;$i<$loop;$i++){
$url = 'http://www.dbjr.com.cn/?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 = 'http://www.dbjr.com.cn/?id='.$i;
$shorta = shorturl($url);
$short = $shorta[0];
if(in_array($short, $repeats)){
$result[$short][] = $url;
}
}
var_dump($repeats);
var_dump($result);
結(jié)果:
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) "http://www.dbjr.com.cn/?id=1640"
[1] =>
string(27) "http://www.dbjr.com.cn/?id=18661"
}
'fMneYf' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=2072"
[1] =>
string(26) "http://www.dbjr.com.cn/?id=8480"
}
'3eQBzq' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=4145"
[1] =>
string(26) "http://www.dbjr.com.cn/?id=4273"
}
'j2mmuy' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=7131"
[1] =>
string(27) "http://www.dbjr.com.cn/?id=17898"
}
'qEZbIv' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=7320"
[1] =>
string(26) "http://www.dbjr.com.cn/?id=8134"
}
'uQFnay' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=7347"
[1] =>
string(26) "http://www.dbjr.com.cn/?id=7962"
}
'FJj6Fr' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=8628"
[1] =>
string(26) "http://www.dbjr.com.cn/?id=9031"
}
'3Eviym' =>
array(2) {
[0] =>
string(27) "http://www.dbjr.com.cn/?id=11175"
[1] =>
string(27) "http://www.dbjr.com.cn/?id=14437"
}
}
1)將長(zhǎng)網(wǎng)址md5生成32位簽名串,分為4段, 每段8個(gè)字節(jié);
2)對(duì)這四段循環(huán)處理, 取8個(gè)字節(jié), 將他看成16進(jìn)制串與0x3fffffff(30位1)與操作, 即超過(guò)30位的忽略處理;
3)這30位分成6段, 每5位的數(shù)字作為字母表的索引取得特定字符, 依次進(jìn)行獲得6位字符串;
4)總的md5串可以獲得4個(gè)6位串; 取里面的任意一個(gè)就可作為這個(gè)長(zhǎng)url的短url地址;
下面是PHP代碼:
復(fù)制代碼 代碼如下:
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('http://www.dbjr.com.cn/');
var_dump($urls);
結(jié)果
復(fù)制代碼 代碼如下:
array(4) {
[0]=>
string(6) "alms1l"
[1]=>
string(6) "2ipmby"
[2]=>
string(6) "avo1hu"
[3]=>
string(6) "fdlban"
}
另外一個(gè)版本:
復(fù)制代碼 代碼如下:
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;
}
結(jié)果:
復(fù)制代碼 代碼如下:
array(4) {
[0] =>
string(6) "6jmMVj"
[1] =>
string(6) "2EnIby"
[2] =>
string(6) "6vIVfu"
[3] =>
string(6) "B7Fb6n"
}
但是升級(jí)版本碰撞率反而更高了,不知道為什么。
測(cè)試碰撞的測(cè)試代碼:
復(fù)制代碼 代碼如下:
$result = array();
$repeats= array();
$loop = 20000;
for($i=0;$i<$loop;$i++){
$url = 'http://www.dbjr.com.cn/?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 = 'http://www.dbjr.com.cn/?id='.$i;
$shorta = shorturl($url);
$short = $shorta[0];
if(in_array($short, $repeats)){
$result[$short][] = $url;
}
}
var_dump($repeats);
var_dump($result);
結(jié)果:
復(fù)制代碼 代碼如下:
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) "http://www.dbjr.com.cn/?id=1640"
[1] =>
string(27) "http://www.dbjr.com.cn/?id=18661"
}
'fMneYf' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=2072"
[1] =>
string(26) "http://www.dbjr.com.cn/?id=8480"
}
'3eQBzq' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=4145"
[1] =>
string(26) "http://www.dbjr.com.cn/?id=4273"
}
'j2mmuy' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=7131"
[1] =>
string(27) "http://www.dbjr.com.cn/?id=17898"
}
'qEZbIv' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=7320"
[1] =>
string(26) "http://www.dbjr.com.cn/?id=8134"
}
'uQFnay' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=7347"
[1] =>
string(26) "http://www.dbjr.com.cn/?id=7962"
}
'FJj6Fr' =>
array(2) {
[0] =>
string(26) "http://www.dbjr.com.cn/?id=8628"
[1] =>
string(26) "http://www.dbjr.com.cn/?id=9031"
}
'3Eviym' =>
array(2) {
[0] =>
string(27) "http://www.dbjr.com.cn/?id=11175"
[1] =>
string(27) "http://www.dbjr.com.cn/?id=14437"
}
}
相關(guān)文章
PHP 下載文件時(shí)如何自動(dòng)添加bom頭及解釋BOM頭和去掉bom頭的方法
在utf-8編碼文件中BOM在文件頭部,占用三個(gè)字節(jié),用來(lái)標(biāo)示該文件屬于utf-8編碼,現(xiàn)在已經(jīng)有很多軟件識(shí)別bom頭,但是還有些不能識(shí)別bom頭,比如PHP就不能識(shí)別bom頭,這也是用記事本編輯utf-8編碼后執(zhí)行就會(huì)出錯(cuò)的原因了2016-01-01PHP?ceil()函數(shù)浮點(diǎn)數(shù)向上取整實(shí)現(xiàn)示例
這篇文章主要為大家介紹了PHP?ceil()函數(shù)實(shí)現(xiàn)浮點(diǎn)數(shù)向上取整示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01nginx簡(jiǎn)單配置多個(gè)php服務(wù)實(shí)例教程
nginx安裝剛安裝好是不能訪(fǎng)問(wèn)php文件的,需要我們進(jìn)行配置,下面這篇文章主要給大家介紹了關(guān)于nginx簡(jiǎn)單配置多個(gè)php服務(wù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01thinkPHP5框架整合plupload實(shí)現(xiàn)圖片批量上傳功能的方法
這篇文章主要介紹了thinkPHP5框架整合plupload實(shí)現(xiàn)圖片批量上傳功能的方法,結(jié)合實(shí)例形式分析了thinkPHP結(jié)合pluploadQueue實(shí)現(xiàn)上傳功能的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11laravel 解決Validator使用中出現(xiàn)的問(wèn)題
今天小編就為大家分享一篇laravel 解決Validator使用中出現(xiàn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10tp5框架使用composer實(shí)現(xiàn)日志記錄功能示例
這篇文章主要介紹了tp5框架使用composer實(shí)現(xiàn)日志記錄功能,結(jié)合實(shí)例形式分析了thinkPHP5框架composer安裝及日志記錄相關(guān)操作技巧,需要的朋友可以參考下2019-01-01關(guān)于UEditor編輯器遠(yuǎn)程圖片上傳失敗的解決辦法
因?yàn)閱渭兿矚g UEditor 的界面,于是把項(xiàng)目中原先的編輯器進(jìn)行的替換,但在后續(xù)操作中發(fā)現(xiàn)一些問(wèn)題,就是遠(yuǎn)程圖片上傳2012-08-08