アイデア:
1) 長い URL md5 から 32 ビットの署名文字列を生成し、4 つのセグメントに分割します。各セグメントは 8 バイトです。
2) ループ処理のこれら 4 つのセクションでは、8 バイトを 16 進文字列として扱い、0x3fffffff (30 ビット 1) で動作します。つまり、30 ビットを超える処理は無視されます。3) これらの 30 桁は 6 つのセグメントに分割され、各 5 桁の数字が特定の文字を取得するために使用され、6 桁の文字列が順番に取得されます。
4) 合計 md5 文字列は 4 つの 6 桁の文字列を取得でき、それらのいずれかをこの長い URL の短い URL アドレスとして使用できます。以下は PHP コードです:
function shorturl($url='', $prefix='', $suffix='') {
$base32 = 配列 (
'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 = '';
for ($j = 0; $j
$val = 0x0000001F & $int;
$out .= $base32[$val];
$int = $int >>
}
$output[] = $out;
}
$output を返す;
}
$urls = shorturl('http://www.php100.com');
var_dump($urls);