21

さて、これは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

これで十分ですか?

4

2 に答える 2

5

私が作成したファイル アップロード アプリケーションには、この機能も必要でした。この SO articleを読んだ後、乱数だけを使用して、それらがDBに存在するかどうかを確認することにしました。

したがって、あなたのアプローチは私がしたことと似ています。

于 2011-01-01T14:10:19.163 に答える
2

URL短縮とはどういう意味ですか?

非常に異なるテクニックがあります。私の知る限り、ほとんどのWebサイトは、この手法を使用して、データベースの主キー(おそらくエンコードされたもの)をURLの正規表現で解析できる位置に配置し、残りをキーワードで強化します。

アマゾンの例:http://www.amazon.de/Bauknecht-WA-PLUS-614-Waschmaschine/dp/B003V1JDU8/

製品名の代わりに何でも入力できますが、最後の ID だけが重要です。

ただし、リンクをクリーンに保ち、それが正しいかどうかを確認し、実際の URL に 301 転送を行うか、間違った URL が表示された場合は正規の URL を配置することをお勧めします。

でも:

TinyURLのようなことをしたい場合、私の答えは明確なノーです。

それは十分ではありません。

まあそれは依存します。

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

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

ただし、データベースの自動インクリメント主キーを使用しないのはなぜですか? セキュリティが重要な場合は、6 文字以上にする必要があります。

私が行ったプロジェクトでは、次のようなものを使用しました

/database-primary-key/hash-of-primary-key-with-some-token-or-client-information/

このようにして、データベース内の主キーを直接検索することができました。これは可能な限り最速の方法でしたが、ハッシュによるブルート フォースによってリンクが検出されなかったことを確認することもできました。私の場合、ハッシュは、クライアントの秘密トークンと主キーの SHA-1 合計でした。

于 2011-01-01T14:04:25.013 に答える