PHPで短縮URLを実装する方法

步履不停
步履不停オリジナル
2019-06-06 11:08:206971ブラウズ

PHPで短縮URLを実装する方法

1. 背景の紹介##多くの人がそう思っていると思います。携帯電話を使用する 私たちは皆、いくつかのマーケティング テキスト メッセージを受け取ったことがあります。テキスト メッセージには、以下に示すように、いくつかの URL が含まれていることがあります。

これらの URL は非常に短いことが多いですが、それを開くと、注意深く見ると、ブラウザのアドレス バーに表示される URL は、テキスト メッセージに表示される URL ではありません。これは短縮 URL です。

PHPで短縮URLを実装する方法

2. 原理と応用短い URL は通常、非常に短いドメイン名、つまりパスを使用します。パラメータは通常 3 ~ 6 文字のみで構成されており、非常に簡潔です。

短縮 URL を使用する前提は、まず短縮 URL を生成することです。これは主に特定のアルゴリズムを使用して、一般的に使用される 0 ~ 9、a ~ z から短い文字を長い文字に対応させます。 、A ~ Z、合計 62 文字 で 6 文字を選択すると、62 の 6 乗通りの組み合わせがあり、約 568 億の一意の短縮 URL が利用可能になります。

サーバーは、パス パラメーターを通じて実際の長い URL をクエリし、301/302 を使用して実際の URL にジャンプします。

ジャンプに関しては、301 は永続的なリダイレクト、302 は一時的なリダイレクトです。短縮アドレスは一度生成されると変更されないため、301 を使用すると http セマンティクスと一致し、ブラウザはジャンプ アドレスを記録し、同時にサーバーへの負荷がある程度軽減されます。ただし、301だとショートアドレスのクリック回数がカウントできないので、データ統計の要件がある場合は302ジャンプの方が良いかもしれません!

短い URL の主な利点は、特にテキスト メッセージで使用する場合に、転送と記憶が容易になることです。SMS にはコンテンツ内の単語数に制限があります。たとえば、短い URL は共有にも使用されます。微博で!

3. 市場の既存事例市場には無料のショートリンクサービスが多数あり、機能は基本的に同じです。限界!

(1) Baidu のショート リンク (dwz.cn/)、Baidu は Web ページの入り口を提供するだけでなく、シンプルで使いやすいインターフェイスと開発ドキュメントも提供します。

(2) Sina のショート リンク (sina.lt/) は現在、Web ページの入り口のみを提供しており、インターフェイス サービスは見つかりません。

(3) タオバオのショート リンク (tb.am/) は現在、Web ページの入り口のみを提供しており、インターフェイス サービスは見つかりません。

市場には他にもショート リンク サービスを提供する小規模な会社が多数あり、一部無料の会社や有効なショート リンクもあるので、ここでは 1 つずつ紹介しません。

4. 一般的に使用されるアルゴリズムインターネット上でより一般的なアルゴリズムには、16 進アルゴリズム、ダイジェスト (ハッシュ) アルゴリズム、乱数アルゴリズムなどがあります。

1 ベース アルゴリズムこのアルゴリズムは、自己増加シーケンス アルゴリズムとも呼ばれます。インターネット. 繰り返しが無いのが特徴です. 設定 IDは自動的にインクリメントされます. 10進数のIDは62桁の1対1に対応するので重複することはありません. 文字数が少ないという特徴を利用しています.低ベースが高ベースに変換されると減少します。

コンピュータで一般的な基数系には 2 進数、8 進数、10 進数、16 進数があり、基数が大きいほど表現できる数が多くなり、使用する語数も少なくなります。例を次に示します: 10 進数の

1000 は、8 進数では 1750、16 進数では 3E8 になります。16 進数ではどうなるでしょうか。このコンピュータには Base 62 は存在しないという人もいます。 。 。無いけど作れます 基数変換アルゴリズムは固定です 最も一般的なのは「基数による除算」です!

62 桁の文字シーケンスは 0-9a-zA-Z であると仮定します。順序が崩れる可能性がありますが、修正する必要があります。これは 0 から 61 で始まる配列です。これをこれと呼びます。とりあえず、アルファベットについて!

====>1000/62 = 16、余り 8

====>16/62 = 0、余り 16

によって得られる数残りは 16 と 8 です。次に、アルファベットで 16 と 8 のマークが付いている文字を見つけて、それらを組み合わせると、g8 になります。これは非常に短く、わずか 2 桁です。少なくとも 6 桁の文字を生成したい場合は、比較的大きな数値から始めることができます。詳細については、以下の図を参照してください:

1 桁 62 0 - 61 2 桁 3844 62 - 3843 3桁数 約230,000 3844 - 238327 4桁 約1,400万 238328 - 14776335 5桁 約9億1,000万 14776336 - 916132831 6桁 約568億 916132832 - 56800235583 コードをコピー


#.Hashアルゴリズム最初の方法:

単純に長いリンク md5 にソルトを適用すると、32 ビット文字列が生成され、そこからランダムに 6 文字を選択するか、単純に大まかに取得します。最後の 6 桁ですが、md5 には 0-9A-Fa-f しか含まれておらず、これはアルファベットよりも文字数が少ないため、競合の可能性が高くなります。

2 番目の方法:

1. 長い URL md5 から 32 ビットの署名文字列を生成し、4 つのセグメントに分割し、各セグメントは 8 バイトです

2. これら 4 つのセグメントをループで処理し、8 バイトを取得し、16 進文字列として扱い、0x3fffffff (30 ビット 1) で演算します。つまり、30 ビットを超える処理を無視します。

3 .これら 30数字は 6 つのセグメントに分割されます。各 5 桁の数字は、特定の文字を取得するためのアルファベットのインデックスとして使用されます。6 桁の文字列

4 が順番に取得されます。合計の md5 文字列は 4 を取得できます6 桁の文字列 Take どれでもこの長い URL の短い URL アドレスとして使用できます

生成方法はより複雑で重複の可能性は低いですが、それでも競合は発生します。

3. 乱数アルゴリズム

これはもっと簡単で、62 文字の配列をランダムに選択し、そのうちの 6 つを選択するだけです。コードはシンプルで使いやすいですが、重複した競合が必ず発生します。

4. アルゴリズムの比較

最初のアルゴリズムは、自己増加 ID の問題を解決する限り、競合を回避できます。 ID を増やすと、データベースを使用して自動的に ID を増やすことができます。主キーを増やすには、ショート コードが生成されるたびにデータベース操作が 1 回だけ必要です (操作を挿入し、主キー ID を取得し、ショート コードを計算します)

2 番目と 3 番目のアルゴリズムは実際には似ており、どちらも依存しています。プログラムはランダムで競合が発生しやすいため、データベースに挿入されるたびに厳しい判断が必要となり、効率が低下します。

5. セキュリティ

短いリンクは送信と記憶を促進しますが、リンク内の文字数が少ないため、その可能性が高くなります。爆発、推測攻撃、攻撃者はすべての文字で構成されるリンクを簡単に横断できます。

したがって、パスワード リセット リンクなどのプライベート URL を送信するために短いリンクを使用することはお勧めできません。また、一部の権限や機密情報を含むリンクに対しては二次認証を行う必要があります。

推奨チュートリアル: Laravel 実践開発ショートリンクジェネレータービデオチュートリアル

以上がPHPで短縮URLを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。