7

文字列を一意に短縮したい-bit.lyなどのURLで使用するファイルID。データベースのIDを使用できますが、URLをランダムにしたいと思います。

最善の解決策は何でしょうか?

サイトはモバイルサイトになりますので、できるだけ短くしたいです

4

5 に答える 5

6

任意の文字列を「一意に短縮」することはできません。鳩の巣原理とすべて。

あなたがしたいこと(そして、URL短縮サービスが行うことをAFAIK)は、提出されたすべてのものと使用された短い文字列のデータベースを保持することです。次に、データベースで検索できます。

数値をインクリメントし、毎回Base64でエンコードするだけで、短い文字列を生成できます。

于 2010-01-12T21:11:43.863 に答える
6

説明したようなマッピングサービスを実装するには、2つの方法があります。

  1. クライアントはグローバルに一意のIDを送信する、または
  2. サーバーはグローバルに一意のIDを生成します

クライアントはグローバルに一意のIDを送信します

私の知る限り、1。Guid十分に異なる情報を短いバイトストリームに詰め込むための同様の手段を考案しない限り、1。はsでのみ試行する必要があります。いずれにせよ、グローバルに一意の識別子を表すバイトストリームがある場合は、次のようにすることができます。

// source is either a Guid, or some other globally unique byte stream
byte[] bytes = Guid.NewGuid ().ToByteArray ();
string base64String = Convert.ToBase64String (bytes).Trim ("=");

ランダムに見えるが、他のランダムスキームに固有の衝突を回避する、ユーザーが読み取り可能な英数字の文字列を取得します。AGuidには16バイト、つまり128ビットが含まれています。これは、完全なBase64エンコーディングの場合は約19文字に相当します。

このアプローチの利点は、クライアントが中央の権限なしで独自の小さなURIを生成できることです。欠点は、でロールしGuidたり、独自のグローバルに一意のバイトストリームを実装したりすると、長さが長くなることです。これは、エラーが発生しやすくなります。

このルートを使用する場合は、Googleがグローバルに一意のバイトストリームなどを使用することを検討してください。ああ、そしてランダムなバイトから離れてください。そうしないと、小さなURIジェネレーターのに衝突解決を構築する必要があります。

サーバーはグローバルに一意のIDを生成します

繰り返しますが、上記の主な利点は、クライアントが事前にURIを生成できることです。チェックしたい長期的なリクエストを送信しようとしている場合に特に便利です。これはあなたの状況に特に関係がないかもしれず、限られた価値しか提供しないかもしれません。

したがって、それはさておき、単一の機関がIDを生成して実行する、サーバー中心のアプローチの方が魅力的かもしれません。これがあなたが選ぶルートであるならば、唯一の質問はあなたがあなたのウリをどれくらい長くしたいかということです。

必要な長さを5文字とすると、Base64エンコーディングを使用すると、各IDは最大5文字×7ビット/文字を表すことができます。これは35ビットまたは2 ^ 35 [34 359738368]の個別の値に相当します。これはかなり大きなドメインです。*

次に、特定の送信に対して値を返すことが問題になります。これを行うにはおそらく非常に多くの方法がありますが、私はこのようなものを使用します、

  • データベースの「フリーリスト」内のすべての可能な値を列挙します
  • 消費時にフリーリストから値を削除します
  • リリース時にフリーリストに付加価値を追加

拡張または最適化には、次のものが含まれる場合があります

  • 範囲[0、2 ^ 35]のすべての値を列挙するのではなく、管理可能なサブセット、たとえば一度に100 000の値を列挙し、すべての値が消費されたら、さらに100000の値を順番に生成して続行します。
  • 有効期限を値に追加し、有効期限が切れた値を1日の終わりにリサイクルします
  • サービスを並列化する場合は、サービスを分散します。無料リストの相互に排他的な小さなサブセットを分散サービスに単純に割り当てます。

結論

要するに、一意性を保証したいので、衝突は大したことではありません。


* = 34 359 738 368はrawドメインのサイズであり、これはすべて長さ0から5のIDです。すべてのIDを最小および最大5の長さに制限することに関心がある場合、ドメインは長さ0〜5(2 ^ 35)のすべてのIDから長さ0〜4(2 ^ 28)のすべてのIDを差し引いたもののように見えます。 35-2 ^ 28 = 34 091 302 912、これはまだかなり大きいです:)

于 2010-01-12T21:54:23.660 に答える
0

ランダムな英数字の文字列を保存し、それを短縮URLに使用します。あなたのサイトに最適だと思う長さにしてください。www.yoursite.com/d8f3

于 2010-01-12T21:11:45.140 に答える
0

ハッシュ(CRC32など)を使用して、非常に短いURLを生成できます。データを削減しているため、「一意の」URLを取得することはできません。そのため、衝突が発生する必要があります。

于 2010-01-12T21:13:38.943 に答える
-2

ねえ、他の何人かの人があなたに言ったように..あなたがURLを何か小さいものに圧縮し始めるならば、あなたがそれをユニークに保つことは不可能でしょう。とはいえ、送信されたすべてのURLに対して独自のコーディングを行う必要があります。これを行う1つの(簡単な)方法は、送信されたURLからデータベースを作成し、それぞれのGUIDフィールドを生成してからサブ文字列を取得し、登録するたびに以前とはまったく異なることを確認することです。

例:www.google.com with guid F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4-> http://www.mysite.com/?q=CEB2

使用する文字が増えるほど、追跡できるリンクの量も増えます。このサンプルでは、​​65536の異なるリンクがあります(16進数で4文字のみ)。

お役に立てれば。

于 2010-01-12T23:32:04.570 に答える