2011-01-01 22 views
20

これは厳密にはURLの短縮についてではありませんが、私の目的はとにかくそうですので、そのように見てみましょう。もちろん、URL短縮する手順は、次のとおりです。URL短縮アルゴリズム

  1. は、完全なURLを取り
  2. キーであることをユニークな短い文字列を生成したURLの
  3. ストアURLとデータベース内のキー(キー - ここで完璧な試合になるだろう)

今、2番目のポイントについて。ここに私が思いついたことがあります:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DataOutputStream dos = new DataOutputStream(baos); 
UUID uuid = UUID.randomUUID(); 
dos.writeLong(uuid.getMostSignificantBits()); 
String encoded = new String(Base64.encodeBase64(baos.toByteArray()), "ISO-8859-1"); 
String shortUrlKey = StringUtils.left(encoded, 6); // returns the leftmost 6 characters 
// check if exists in database, repeat until it does not 

これで十分ですか?

+0

困ったことに、なぜUUIDを気にしていますか?なぜ、ランダムインスタンスから5バイト程度しか生成しないのですか? –

+1

私はrandom/System.nanoTime/macアドレスのビットを起動して、uuidにこれらのすべてがあることを認識しました:-) – Bozho

+0

@Bozho [Base32 encoding aka Crockford encoding](http://www.crockford .com/wrmg/base32.html)には、0や文字Lのようなあいまいな文字を削除するなどの利点があるため、長いURLで終わることになりますが、何十億という価値がない場合はおそらく価値があります。 –

答えて

4

私が書いたファイルアップロードアプリケーションでは、この機能も必要でした。this SO articleを読んで、私はちょうどいくつかの乱数をつけて、それらがDBに存在するかどうかをチェックすることに決めました。

あなたのaproachは私が行ったのと似ています。

2

URL短縮の意味は?

非常に異なる技術があります。ほとんどのWebサイト(AFAIK)は、この技術を使用して、正規表現で解析でき、キーワードで残りの部分を強調することができるように、データベースのプライマリキー(おそらくエンコードされた)をURLに挿入します。アマゾンから

例:あなたは、製品の名前の代わりに何かを入力することができますhttp://www.amazon.de/Bauknecht-WA-PLUS-614-Waschmaschine/dp/B003V1JDU8/

、最後のIDのみが重要です。

しかし、あなたのリンクをきれいに保ち、それが正しいかどうかをチェックして、実際のURLに転送するか、間違ったURLが表示された場合は正規のURLを入れることができます。しかし

あなたがTinyURLのような何かをしたい場合は、私の答えは明確なノーです。

十分ではありません。

まあそれに依存します。

「安全」ではありません。 URLを推測するのはかなり簡単です。より良いアプローチは、SHA-1/MD5のような暗号機能を使用することです。

衝突になると、私は本当に分かりません。 GUIDは衝突のないように設計されていますが、最初の6文字のみを使用しています。私は彼らがアルゴリズムで何を表しているか正確にはわかりません。しかし、それは間違いなく最適ではない。

なぜ、データベースの自動増分プライマリキーを使用しないのですか?セキュリティが重要な場合は、間違いなく6文字以上で行ってください。私は

/データベース主キー/ハッシュのプライマリ・キーと - いくつかのトークン・オア・クライアント情報/

のように、この方法は何かを使用したプロジェクトで

私は直接可能な最速の方法であったデータベース内の主キーを直接調べることができましたが、ハッシュによって強制されたブルートゥースによってリンクが見つからないことを検証することもできました。私の場合、ハッシュはクライアントの秘密トークンとプライマリキーのSHA-1の和です。

+0

URLを推測するのはなぜ簡単だと思いますか?私はそうは思わない。ハッシュ関数は必要以上の出力を生成するので、やはりトリムする必要があります。ハッシュされたDBプライマリ・キーは問題ありませんが、データベースにオプションがある必要はありません。 Key-Valueストアではない – Bozho

+0

URL shorternerの場合、誰かがURLを推測できるのはどうして重要ですか?最終的には、そのページにリダイレクトされ、アクセスは一般公開されている(標準のWebページの場合)か、その他の手段によって制限されます。 – Rob

+0

はユースケース@Robに依存します。もしそうなら、なぜ単に自動インクリメントを使うのではなく、すべてのハッシュを行うのですか?私は、ユースケースと要件が問題ではっきりしていないことを明確にしようとしていました。 –