0

新しい URL 短縮サービスを作成していますが、Bijective 関数が必要であると読みました。そこで、Jon Skeet の BiDictionary (すばらしい) を見つけて、これを URL 短縮アプリケーション内でどのように使用するかを考えました。現在、データベース ID 列を Base36 エンコードして短縮 URL を作成し、完全な URL をテーブルに格納しています。これは問題なく動作しますが、なぜ全単射関数を使用する必要があるのか​​わかりません。データベースの値を全単射辞書に保存しますか? 私が現在持っているものは十分に機能していますか?全単射辞書を使用する利点は何ですか?

4

1 に答える 1

2

あなたの質問を完全に理解しているかどうかはよくわかりません...

あなたが正しく理解している場合、一意の ID と URL を持つルックアップ テーブルが作成されています。短縮 URL は Base36 でエンコードされた ID です。

使用例を見てみましょう。

  • 短縮 URL を作成する
    ということは、その URL がテーブルに既にあるかどうかを実装で確認することを意味します (単純に、Base36 でエンコードされた ID を返すだけです)。
    それ以外の場合は、新しいエントリを作成して、新しい ID の Base36 エンコーディングを返します。

  • 完全な URL のルックアップ
    Base36 値を ID にデコードし、テーブルで ID をルックアップして、見つかった場合は完全な URL を返します。

したがって、基本的に、全単射関数 (双方向の 1:1 対応) を作成しました。これは、損失なしで双方向に機能するものであり、テーブル内の指定された URL に関して完全に可逆です。Base36 のエンコード/デコードも完全に可逆であるため、これも全単射関数です :-)

あなたBiDictionaryが言及したJonからは、メモリ内キャッシュの良いベースになるでしょう(ライトスルーをお勧めします)ので、可能な限りDBラウンドトリップを避けることができます。複数のスレッドからアクセスできるキャッシュのBidictionary使用については、 を使用することを強くお勧めします。あなたの場合、常に 1:1 の対応があるため、Jon の実装の一部は必要ありません。検索を高速化するには、Base36 でエンコードされた値をキーとして使用できます...DictionaryConcurrentDictionaryList<>

于 2011-08-21T14:27:53.903 に答える