短縮リンクについては説明しません。誰もがすでに知っています。短縮リンクは次のとおりです。
Sina Weibo http://t.cn/SVpONM
Tencent Weibo http://url.cn/302yor
Yun.io http://d.yun.io/PNri2v
短いリンクの利点: 1. コンテンツが必要である; 2. ユーザーフレンドリーである; 3. 管理が簡単である。
実装方法には、大きく分けて 3 つのステップがあります:
1. 長い URL を短い文字列にマッピングできる URL マッピング アルゴリズムを定義します。
2. 完成したマッピングを保存するためにストレージ (データベース? NoSQL?) を使用します。独自の URL マッピング アルゴリズムを実装します。
一般的に言えば、3 番目のステップは、長い URL 文字列を短い文字列にマッピングする方法です。 3 つの方法をまとめました:
一般的な実装
10 進数と 2 進数の間の変換、または 10 進数と 16 進数の間の変換については、誰もが学んだことがあるかと思います。数値を短くするために、62 桁のシステムを使用できます。トランスコードされ、短い文字列に変換されます。
このアプローチの欠点は、すべてのリンクのビット長を確実に固定する方法がないことです。同時実行性が高い場合、迅速な配信を確保する方法が問題になります。
具体的な実装方法:
コードをコピーします コードは次のとおりです:
/**
* 短いリンクのデジタル ID をエンコードするには 16 進数を使用します。欠点は、各短いリンクが固定長であることが保証できないことです
*
* @author wanshiqiang @param integer $integer
* @パラメータ文字列 $base
*/
private function getShortenedURLFromID ($integer, $base = ALLOWED_CHARS)
{
$length = strlen($base );
while($integer > $length - 1)
{
$out = $base[fmod($integer, $length)]
$integer = Floor( $integer; / $length );
戻り $base[$integer]
}
/**
* 16 進数でエンコードされた短いリンクをデコードします
*
* @author wangshiqiang
* @param string $string
* @param string $base
*/
プライベート関数 getIDFromShortenedURL ($string, $base = ALLOWED_CHARS)
{
$length = strlen ($base);
$size = strlen($string) - 1;
$string = str_split($string);
foreach($string として $); i => $char )
{
$out += strpos($base, $char) * pow($length, $size - $i)
}
return $out
}
文字通りの実装
アルゴリズムの説明: 短いリンクを表すには 6 文字を使用します。ASCII 文字の「a」~「z」、「0」~「5」、合計 32 文字をセットとして使用します。各文字には 32 の状態があります。6 つの文字は 32^6 (1073741824) を表すことができます。したがって、これらの 6 つの文字を取得する方法は次のように説明されます。
32 ビット文字列を取得するための受信長い URL。 16 の 32 乗。これは基本的に一意性を保証します。この 32 ビットを 4 つの部分に分割すると、各部分は 8 文字になります。このときの確率は 16 の 8 乗、つまり 4294967296 になります。この数値の衝突確率も比較的小さいです。この 8 ビット文字を 16 進整数、つまり 1*('0x'.$val) とみなして、0 ~ 30 ビットを 5 個のグループごとに取り、その整数値を計算して、次のようにマッピングします。用意された32文字から、最終的に6桁のショートリンクアドレスを取得できます。
PHP の実装は次のとおりです:
コードをコピー
コードは次のとおりです:
function short( $long_url ) { $base32 = "abcdefghijklmnopqrstuvwxyz012345"; $hex = md5( $long_url );
$hexLen = strlen ( $hex );
$subHexLen = $hexLen / 8;
$output = array();
for( $i $subHex = substr( $hex , $i * 8, 8 );
$subHex = 0x3FFFFFFF & ( 1 * ('0x' . $subHex ) ); $out = ''for( $j = 0; $j < 6; $ j++ )
$val = 0x0000001F & $int;
$int = $int >> $out;
}
return $output;
2 番目の実装
次の関数は、短いリンクが再利用されないようにクエリ操作を使用できます。これは本当に信頼できますか~~
コードをコピーします
コードは次のとおりです:
function random($length, $pool = '') {
$random = ''; empty($pool)) { $pool = 'abcdefghkmnpqrstuvwxyz'; $pool .=
'23456789' }
for($i = 0; $i substr($pool,(rand()%(strlen ($pool))), 1) }
$random を返す
;
Technorati タグ: 短いリンク、短い URL、マッピング、ハッシュ
参考:
1. Weiboショートアドレスの原理分析
2. Weiboショートドメイン名の原理と機能
3、Yours.org
4. 素晴らしい PHP URL 短縮スクリプト
5. PHP 短縮 URL アルゴリズムの実装
6. 独自の短縮 URL を実装します
7. 短縮URLアルゴリズムの暫定的な概要
8. 短い URL の実装
http://www.bkjia.com/PHPjc/324818.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/324818.html技術記事短いリンクについては説明しません。誰もがすでに知っているので、短いリンクは次のとおりです。 Sina Weibo http://t.cn/SVpONM Tencent Weibo http://url.cn/302yor Yun.io http:/ /d.yun.io/PNri2v ショートリンク...