さて、これは厳密にはURL短縮ではありませんが、とにかく私の目的はそういうことなので、そのように見てみましょう。もちろん、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
これで十分ですか?
私が書いたファイルアップロードアプリケーションには、この機能も必要でした。 this SO article )を読んだ後、いくつかの乱数だけを使用して、それらがDBに存在するかどうかを確認することにしました。
だからあなたのアプローチは私がしたことと似ています。
さて、URL短縮とはどういう意味ですか?
非常に異なるテクニックがあります。ほとんどのWebサイト、AFAIKは、この手法を使用して、データベースの主キー(おそらくエンコードされたもの)フォームを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合計でした。