アイデア:
1) 長い URL の md5 から 32 ビットの署名文字列を生成し、4 つのセグメントに分割します。各セグメントは 8 バイトです。
2) これらの 4 つのセグメントをループで処理し、8 バイトを取得します。それらを 16 進数の文字列に読み取り、0x3fffffff (30 ビット 1) で操作します。つまり、30 ビットを超える部分は無視されます。
3) これらの 30 ビットは 6 つのセグメントに分割され、各 5 桁の数値が 1 として使用されます。特定の文字を順番に取得するためのアルファベットのインデックス。6 桁の文字列を取得します。
4) 合計 md5 文字列は 4 つの 6 桁の文字列を取得でき、そのいずれかをこの短縮 URL アドレスとして使用できます。長い URL;
次は PHP コードです:
コードをコピーします コードは次のとおりです:
関数 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 $subHex = substr ($hex, $i * 8, 8);
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
$out = ''; 0; $j $val = 0x0000001F & $int .= $int > ; ;
}
$output[] = $out;
return $output;
$urls = shorturl(' ');
var_dump($urls);
結果
array(4) { [0]=> string(6) "alms1l" [1]=>string(6) "2ipmby"
[2]=>文字列(6) "avo1hu"
[ 3]=>
文字列(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);
$output = array(); = 0; $subHexLen; $i ) {
$subHex = substr ($i * 8, 8); subHex));
$out = '';
for ($j = 0; $j $val = 0x0000003D & $int; = $base[$val];
$int = $int >> }
$output[] =
}
>}
結果:
コードをコピーします
コードは次のとおりです:
array (4) {
[0] =>
文字列(6) "6jmMVj"
string(6) "6vIVfu" [3] => string(6) " }
ただし、アップグレードされたバージョンが高いのですが、理由はわかりません。
衝突をテストするためのテスト コード:
コードをコピー
コードは次のとおりです:
$result = array() ;
$repeats= array();
$short = $shorta[0]; )){ $repeats[] = $short; } $result[] = $short; } =0; $i<$loop;$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);
var_dump($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' =>
array(2) {
[0] =>;
string(26) "http://www.jb51.net/?id=1640"
[1] =>
string(27) "http://www.jb51.net/?id=18661"
}
'fMneYf' =>
array(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' =>
array(2) {
[0] =>;
string(26) "http://www.jb51.net/?id=7320"
[1] =>
string(26) "http://www.jb51.net/?id=8134"
}
'uQFnay' =>
array(2) {
[0] =>;
string(26) "http://www.jb51.net/?id=7347"
[1] =>
string(26) "http://www.jb51.net/?id=7962"
}
'FJj6Fr' =>
array(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"
}
}