2011-01-01 8 views
20

Nun, dies ist nicht streng URL-Kürzung, aber mein Zweck ist solche sowieso, also lasst es uns so sehen. Natürlich sind die Schritte zur URL-Kürzung sind:URL shortening Algorithmus

  1. die vollständige URL eine eindeutige kurze Zeichenfolge generieren
  2. Nehmen Sie die Schlüssel für die URL
  3. Speichern Sie die URL und der Schlüssel in einer Datenbank zu sein (ein Tasten- Wertspeicher wäre hier eine perfekte Ergänzung)

Nun, über den zweiten Punkt. Hier ist, was ich mir ausgedacht habe:

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 

Ist das gut genug?

+0

Aus Gründen der Neugier, warum sollte man sich mit einer UUID beschäftigen? Warum nicht zum Beispiel nur 5 Bytes aus einer zufälligen Instanz generieren? –

+1

Ich begann mit einem zufälligen/System.nanoTime/die Mac-Adresse 'Bit dann erkannte, dass Uuid all diese :-) – Bozho

+0

@Bozho Sie vielleicht [Base32 Kodierung aka Crockford Kodierung] (http: //www.crockford com/wrmg/base32.html), da es einige Vorteile wie das Entfernen von möglicherweise mehrdeutigen Zeichen wie 0 und den Buchstaben L hat. Sie werden mit einer längeren kurzen URL enden, aber wenn Sie keine Milliarden haben, lohnt es sich vielleicht. –

Antwort

4

Für eine Datei-Upload-Anwendung schrieb ich, ich brauchte diese Funktionalität auch.Nachdem ich this SO article gelesen hatte, entschied ich mich, nur mit ein paar Zufallszahlen zu bleiben und zu prüfen, ob sie in der DB existieren.

So ist Ihre Vorgehensweise ähnlich wie bei mir.

2

Nun, was meinst du mit URL-Kürzung?

Es gibt sehr unterschiedliche Techniken. Die meisten Webseiten, AFAIK, verwenden diese Technik, um den Datenbankschlüssel einfach (in irgendeiner verschlüsselten Form) in die URL an einer Stelle zu bringen, an der er durch einen regulären Ausdruck geparst werden kann, und den Rest einfach mit Schlüsselwörtern zu ergänzen.

Beispiel von Amazon: http://www.amazon.de/Bauknecht-WA-PLUS-614-Waschmaschine/dp/B003V1JDU8/

Sie alles anstelle des Namens des Produkts eingeben, nur die ID am Ende ist wichtig.

Sie können jedoch Ihre Links sauber halten und überprüfen, ob es korrekt ist und 301 Weiterleitung an die echte URL oder eine kanonische URL, wenn eine falsche URL auftaucht.

jedoch:

Wenn Sie so etwas wie TinyURL tun wollen, ist meine Antwort ein klares Nein.

Es ist nicht gut genug.

Nun, es kommt darauf an.

Es ist nicht "sicher". Es wäre ziemlich einfach, URLs zu erraten. Ein besserer Ansatz wäre die Verwendung einiger kryptografischer Funktionen wie SHA-1/MD5.

Wenn es um Kollisionen geht kann ich nicht wirklich sagen. GUID wurde entwickelt, um keine Kollisionen zu haben, aber Sie verwenden nur die ersten 6 Zeichen. Ich weiß nicht, was genau sie im Algorithmus darstellen. Aber es ist definitiv nicht optimal.

Warum verwenden Sie nicht einfach den automatisch inkrementierenden Primärschlüssel der Datenbank? Wenn Sicherheit wichtig ist, müssen Sie auch mit mehr als 6 Zeichen gehen.

Auf einem Projekt, das ich habe so etwas wie

/Datenbank-Primärschlüssel/Hash-of-Primärschlüssel-mit-some-Token-oder-Client-Informationen/

Auf diese Weise habe ich Ich konnte direkt den Primärschlüssel in der Datenbank nachschlagen, was der schnellste Weg war, aber ich konnte auch verifizieren, dass der Link nicht von dem durch den Hash erzwungenen Brute gefunden wurde. In meinem Fall war der Hash die SHA-1-Summe des geheimen Tokens des Clients und des Primärschlüssels.

+0

Warum glauben Sie, dass URLs leicht zu erraten sind? Ich denke nicht. Die Hash-Funktionen erzeugen eine größere Ausgabe als ich brauche, also müsste ich wieder schneiden. Ein Hash-DB-Primärschlüssel ist möglicherweise in Ordnung, aber es ist nicht notwendig, dass die Datenbank eine Option dafür hat. Key-Value-Stores tun nicht – Bozho

+0

Für eine URL shorterner, warum ist es wichtig, wenn jemand eine URL erraten kann? Letztendlich sollten sie auf diese Seite umgeleitet werden, und der Zugriff ist entweder öffentlich (für eine Standard-Webseite) oder auf andere Weise eingeschränkt. – Rob

+0

hängt vom Anwendungsfall @Rob ab. Wenn ja, warum überhaupt Hashing und nicht nur ein Autoinkrement? Ich habe nur versucht klarzustellen, dass der Anwendungsfall und die Anforderungen in der Frage nicht klar sind. –