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