Ich möchte einen URL-Verkürzungsdienst erstellen, bei dem Sie eine lange URL in ein Eingabefeld eingeben können und der Dienst die URL auf "http://www.example.org/abcdef
" verkürzt.
Anstelle von "abcdef
" kann jeder andere String mit sechs Zeichen stehen, der a-z, A-Z und 0-9
enthält. Das ergibt etwa 56~57 Milliarden mögliche Zeichenfolgen.
Mein Ansatz:
Ich habe eine Datenbanktabelle mit drei Spalten:
- id, integer, auto-inkrement
- long, string, die lange URL, die der Benutzer eingegeben hat
- short, string, die verkürzte URL (oder nur die sechs Zeichen)
Dann würde ich die lange URL in die Tabelle einfügen. Anschließend würde ich den Wert des Auto-Inkrement-Feldes "id
" auswählen und daraus einen Hash erstellen. Dieser Hash sollte dann als "short
" eingefügt werden. Aber welche Art von Hash sollte ich erstellen? Hash-Algorithmen wie MD5 erzeugen zu lange Zeichenfolgen. Diese Algorithmen verwende ich nicht, denke ich. Ein selbst entwickelter Algorithmus würde ebenfalls funktionieren.
Meine Idee:
Für "http://www.google.de/
" erhalte ich die Auto-Inkrement-ID 239472
. Dann führe ich die folgenden Schritte aus:
short = '';
if durch 2 teilbar, füge "a"+das Ergebnis zu short hinzu
if durch 3 teilbar, füge "b"+das Ergebnis zu short hinzu
... bis ich Teiler von a-z und A-Z habe.
Das könnte wiederholt werden, bis die Zahl nicht mehr teilbar ist. Glauben Sie, dass dies ein guter Ansatz ist? Haben Sie eine bessere Idee?
<em>Aufgrund des anhaltenden Interesses an diesem Thema habe ich eine effiziente Lösung auf GitHub veröffentlicht, mit Implementierungen für <a href="https://github.com/delight-im/ShortURL" rel="noreferrer">JavaScript</a>, <a href="https://github.com/delight-im/ShortURL/blob/master/PHP/ShortURL.php" rel="noreferrer">PHP</a>, <a href="https://github.com/delight-im/ShortURL/blob/master/Python/shorturl.py" rel="noreferrer">Python</a> und <a href="https://github.com/delight-im/ShortURL/blob/master/Java/ShortURL.java" rel="noreferrer">Java</a>. Fügen Sie Ihre Lösungen hinzu, wenn Sie möchten :)</em>
5 Stimmen
@gudge Der Zweck dieser Funktionen besteht darin, dass sie eine inverse Funktion haben. Dies bedeutet, dass Sie sowohl die Funktionen
encode()
als auchdecode()
haben können. Die Schritte sind daher: (1) URL in der Datenbank speichern (2) Eindeutige Zeilen-ID für diese URL aus der Datenbank abrufen (3) Ganzzahlige ID in kurzen String mitencode()
umwandeln, z.B. von273984
zuf5a4
(4) Verwenden Sie den kurzen String (z.B.f4a4
) in Ihren freigegebenen URLs (5) Beim Empfang einer Anfrage für einen kurzen String (z.B.20a8
) decodieren Sie den String in eine Ganzzahl-ID mitdecode()
(6) Suchen Sie die URL in der Datenbank für die angegebene ID. Zur Umwandlung verwenden Sie: github.com/delight-im/ShortURL0 Stimmen
@ Marco, was ist der Sinn, den Hash in der Datenbank zu speichern?
3 Stimmen
@MaksimVi. Wenn Sie eine invertierbare Funktion haben, gibt es keine. Wenn Sie eine Einweg-Hash-Funktion hätten, gäbe es eine.
2 Stimmen
Wäre es falsch, wenn wir den einfachen CRC32-Algorithmus verwenden würden, um eine URL zu verkürzen? Obwohl eine Kollision sehr unwahrscheinlich ist (eine CRC32-Ausgabe ist normalerweise 8 Zeichen lang und das gibt uns über 30 Millionen Möglichkeiten). Wenn eine generierte CRC32-Ausgabe bereits zuvor verwendet wurde und in der Datenbank gefunden wurde, könnten wir die lange URL mit einer Zufallszahl salzen, bis wir eine eindeutige CRC32-Ausgabe finden, die in meiner Datenbank eindeutig ist. Wie schlimm oder anders oder hässlich wäre das für eine einfache Lösung?
0 Stimmen
Typischer Ansatz zur Umwandlung von einer normalen Zahl zu einem kurzen String in Java