0

私は、単純に数字を取り、カスタムアルファベットを使用してbase-58でエンコード/デコードするPHPエンコード/デコード全単射関数を作成しました。

この短縮機能は正常に機能しますが、特定の単語を制限し、カスタムのバニティ URLを作成できるようにしたいと考えています。

これは、ユーザーがdomain.com/boobsなどへのリンクを再度取得しないことを意味するはずです。

また、全単射機能を中断することなくdomain.com/stackoverflowをdomain.com/12342に解決できるようにしたいと考えています。

提案された解決策

いくつかの提案がありましたが、最適とは思えません。私が考えた方法の 1 つは、カスタム URL をデータベースに保存することです。そのため、1234 => mycoolurl をエンコード/デコードして、既に存在するかどうかを確認します。そうであれば、数値を 10,000,000 のようにオフセットします (したがって、10,001,234 になり、それをエンコード/デコードします。これにより、一部のリンクが他のリンクよりもはるかに長くなり、ハード リミットが 10,000,000 リンクに設定されます (これは実際には問題ありませんが、それでもあまりエレガントではありません)。呪いの言葉の問題を解決するために、DB にダミー リンクを挿入できます。

ご意見をお待ちしております。

4

1 に答える 1

0

私の見方では、全単射関数は短縮機能の一部にすぎず、両方の問題は関数の責任の範囲外です。

カスタムアルファベットからすべての母音を除外することで呪いの言葉の問題に対処できると思います(したがって、ベース58をベース48に変更し、URLの短さを犠牲にします)が、関数自体の中でできることはおそらくそれだけです。

キー値テーブル (またはその他のストレージ) を使用して、最も明白なバリアントを想定して、全体として短縮アルゴリズムを使用すると、次のようになります。

  1. 着信 URL を取得する
  2. ランダムなキー番号を生成し、ストレージが既に使用されているかどうかを確認し、必要に応じて再生成して繰り返します
  3. キーと着信 URL をストレージに保存する
  4. バイジェクション関数を適用して短い URL パスを取得する

結果のパスをストップワード/正規表現のリストと照合し、一致する場合は乱数を再生成することで、呪いの言葉の問題を簡単に解決できます。

バニティ URL に関しては、これは、必要なパスにバイジェクション関数を適用してキー番号を取得し、ステップ 2 で乱数の代わりにそれを使用することで解決できます。もちろん、競合の可能性に備えるか、バニティ短縮 URL のリストを domain.com/reserved などに事前に予約しておく必要があります。また、十分な長さのバニティ ワードを取得するには、明らかに十分な大きさのキー スペースが必要です。4 バイトの int の場合、最大 5 文字のようになります。

もう 1 つのオプションは、短縮機能からバニティ ワードを削除し (ストップ リストに追加することにより)、バイジェクション関数を使用せずに (バニティ URL、短縮 URL) ペアのみを格納する別のエイリアシング関数を実装することです。

于 2014-04-03T11:35:11.773 に答える