ホームページ  >  記事  >  バックエンド開発  >  WeiboショートリンクアルゴリズムPHPバージョン実装コード_PHPチュートリアル

WeiboショートリンクアルゴリズムPHPバージョン実装コード_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:16:15852ブラウズ

アイデア:
1) 長い URL md5 から 32 ビットの署名文字列を生成し、それを 4 つのセグメントに分割します。各セグメントは 8 バイトです。
2) これらの 4 つのセグメントをループで処理し、8 バイトを取得し、16 進数として扱います。文字列は 0x3ffffffff (30 ビット 1) と AND 演算されます。つまり、30 ビットを超える部分は無視されます。
3) これらの 30 ビットは 6 つのセグメントに分割され、各 5 桁の数字がアルファベットのインデックスとして使用されます。特定の文字を入力し、6 桁の文字列を順番に取得します。
4) 合計の md5 文字列は 4 つの 6 桁の文字列を取得でき、そのうちの 1 つをこの長い 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;
$ 出力 = array();
for ($i $subHex = substr ($hex, $i * 8, 8);
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
$out = ''; 6; $j++) {
$val = 0x0000001F & $int;
$int = $int >
}
$output;
}
return $output;
}
$urls = shorturl('http://www.jb51.net/');


結果


コードは次のとおりです:

array(4) { [0]=> string(6 ) "alms1l" string(6) "2ipmby" 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; $subHexLen; $i++) {
$subHex = substr ( $hex, $i * 8, 8);
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
$out = ''; ; $j++) {
$val = 0x0000003D & $int;
$int = $int >
;
return $output
}


結果:



コードをコピーします。 コードは次のとおりです。


array(4) {
[0] =>string(6) "6jmMVj "
[1] =>
string(6) "2EnIby"
[2] =>
string(6) " 6vIVfu"
[3] =>
string(6) "B7Fb6n"
} しかし、アップグレードされたバージョンの衝突率は高くなっています。理由はわかりません。 衝突をテストするためのテストコード:


コードをコピーします。 コードは次のとおりです:


$repeats= array();
$loop = 20000; =0; $i$url = 'http://www.jb51.net/?id='.$i; $shorta[0];
if(in_array($short, $result)){
$repeats[] = $short;
$result[] = $short; for($ i=0;$i$url = 'http://www.jb51.net/?id='.$i;
$shorta = shorturl($url);
$short = $shorta[0];
if(in_array($short, $repeats)){
$result[$short][] = $url;
var_dump($repeats); $result) ; 結果:

コードをコピーします

コードは次のとおりです:

array(8) {
[0] =>
文字列(6) "3eQBzq"
[1] =>
string(6) "uQFnay"
[2] =>
string(6) "qEZbIv"
[3] =>
文字列(6) "fMneYf"
[4] =>
文字列(6) "FJj6Fr"
[5] =>
string(6) "3Eviym"
[6] =>
string(6) "j2mmuy"
[7] =>
string(6) "jyQfIv"
}
array(8) {
'jyQfIv' =>
配列(2) {
[0] =>
string(26) "http://www.jb51.net/?id=1640"
[1] =>
string(27) "http://www.jb51.net/?id=18661"
}
'fMneYf' =>
配列(2) {
[0] =>
string(26) "http://www.jb51.net/?id=2072"
[1] =>
string(26) "http://www.jb51.net/?id=8480"
}
'3eQBzq' =>
配列(2) {
[0] =>
string(26) "http://www.jb51.net/?id=4145"
[1] =>
string(26) "http://www.jb51.net/?id=4273"
}
'j2mmuy' =>
配列(2) {
[0] =>
string(26) "http://www.jb51.net/?id=7131"
[1] =>
string(27) "http://www.jb51.net/?id=17898"
}
'qEZbIv' =>
配列(2) {
[0] =>
string(26) "http://www.jb51.net/?id=7320"
[1] =>
string(26) "http://www.jb51.net/?id=8134"
}
'uQFnay' =>
配列(2) {
[0] =>
string(26) "http://www.jb51.net/?id=7347"
[1] =>
string(26) "http://www.jb51.net/?id=7962"
}
'FJj6Fr' =>
配列(2) {
[0] =>
string(26) "http://www.jb51.net/?id=8628"
[1] =>
string(26) "http://www.jb51.net/?id=9031"
}
'3Eviym' =>
配列(2) {
[0] =>
string(27) "http://www.jb51.net/?id=11175"
[1] =>
string(27) "http://www.jb51.net/?id=14437"
}
}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/325982.html技術記事思路: 1) 长网址md5 生成 32 位签名串、分別 4 段、每段 8 字节。 2)この四段循環処理、取8字节、将他看成16进制串与0x3fffffff(30位1)与操作、すなわち超过...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。