2010-01-12 15 views
6

Ich möchte Strings-Datei-IDs in URLs wie die auf Bit.ly etc. zu verkürzen eindeutig Ich kann IDs von einem db verwenden, aber ich möchte, dass urls zufällig sein.C# Verkürzung der Zeichenfolge für URL

Was wäre die beste Lösung?

Website wird eine mobile Website sein, so dass ich so kurz, um es will wie möglich

+0

Möchten Sie, dass Sie den bit.ly-Service nutzen? Oder musst du deine benutzerdefinierte ausrollen? – keyboardP

+0

Dies ist für meine eigene Website und es ist nicht URL Verkürzung Service, sondern um einzigartige kurze URLs für Dateien – nLL

+2

Der Grund, warum ich fragte, war, weil Sie die bit.ly API verwenden könnten: http://www.emadibrahim.com/ 2009/05/07/shortening-urls-mit-bitlys-api-in-net/ – keyboardP

Antwort

6

können Sie nicht willkürlich strings „eindeutig verkürzen“. Taubenschlagprinzip und alles.

Was Sie tun möchten (und, AFAIK, welche URL-Verkürzungsdienste tun), ist eine Datenbank von allem Übermitteln und der verwendeten kurzen Zeichenfolge. Dann können Sie es in der Datenbank nachschlagen.

Sie können die kurzen Strings generieren, indem Sie einfach eine Zahl inkrementieren und Base64 für jedes Mal codieren.

+0

dachte ich, aber würde es nicht sein, ein bisschen teuer von der Abfrage db Punkt – nLL

+8

Dies ist, was für Datenbanken entwickelt werden. –

+0

+1 Inkrement und Base64 enc. Das scheint genau das zu sein, was das OP verlangt. –

0

Speichern Sie eine zufällige alphanumerische Zeichenfolge und verwenden Sie diese für Ihre kurze URL. Machen Sie es zu der Länge, die Ihrer Meinung nach am besten für Ihre Website ist, und die Nutzer sind so etwas wie www.yoursite.com/d8f3

+0

oi, mag nicht die Verteilung von -1, aber Guid Trunkierung bekam einen , so zufällige Bytes bekommt man auch. vielleicht, wenn Sie fügen Sie die "write a collision handler" -Clause konnte ich widerrufen, aber befürworten zufällige Werte anstelle von eindeutigen Werten ist einfach nur falsch :( –

+2

Ich sagte STORE ihnen. Während seines Speichervorgangs kann er eine Überprüfung, dass es ist Ich denke, es ist meine Schuld, wenn ich annehme, dass er nicht dumm genug ist, keinen Kollisionshandler zu schreiben. – RHicke

0

Sie könnten einen Hash (z. B. CRC32) verwenden, um ziemlich kurze URLs zu erstellen. Sie werden nie in der Lage sein, "eindeutige" URLs zu erhalten, da Sie die Daten reduzieren, so dass es Kollisionen geben muss.

5

Es gibt zwei Methoden zum Implementieren eines Mapping-Service wie den von Ihnen beschriebenen.

  1. Kunden einreichen global eindeutige IDs oder
  2. Server generiert global eindeutige IDs

Kunden einreichen global eindeutige IDs

Soweit ich weiß, 1. nur versucht werden sollte mit Guid s, es sei denn, Sie entwickeln ein ähnliches Mittel, um ausreichend unterschiedliche Informationen in einen kurzen Bytestrom zu stopfen. So oder so, wenn Sie einen Stream von Bytes haben, die eine global eindeutige Kennung darstellen, können Sie so etwas wie dieses

// source is either a Guid, or some other globally unique byte stream 
byte[] bytes = Guid.NewGuid().ToByteArray(); 
string base64String = Convert.ToBase64String (bytes).Trim ("="); 

tun, um eine vom Benutzer lesbare Zeichenfolge von alphanumerischen Zeichen zu erhalten, die zufällig erscheint, aber vermeidet Kollisionen inhärenten in anderen zufälligen Schemata. A Guid enthält 16 Byte oder 128 Bit, was für eine vollständige Base64-Codierung etwa 19 Zeichen entspricht.

Der Vorteil dieses Ansatzes ist, dass Kunden ihre eigenen winzigen Uris ohne eine zentrale Autorität generieren können. Der Nachteil ist eine hohe Länge, wenn Sie mit Guid rollen, oder implementieren Sie Ihren eigenen weltweit einzigartigen Byte-Stream, der - seien wir ehrlich - fehleranfällig ist.

Wenn Sie diese Route gehen, betrachten Sie Google'ing global eindeutige Byte-Streams oder solche. Oh, und Bleib weg von zufälligen BYTES, sonst müssen Sie Kollisionsauflösung ON OFEN Ihren kleinen Uri-Generator bauen.

Server generieren global eindeutige IDs

Auch hier ist der Hauptvorteil der oben ist, dass die Kunden ihre Uris a priori erzeugen kann. Besonders praktisch, wenn Sie eine lang laufende Anfrage einreichen möchten, die Sie überprüfen möchten. Dies ist möglicherweise nicht besonders relevant für Ihre Situation und kann nur begrenzten Wert bieten.

Also, abgesehen davon, könnte ein Server-zentrierten Ansatz, in dem eine einzige Autorität generiert und verteilt IDs attraktiver sein. Wenn dies die Route ist, die du wählst, dann ist die einzige Frage, wie lange möchtest du deinen Uri?

Unter der Annahme einer gewünschten Länge von 5 Zeichen und angenommen, Sie gehen mit einer Base64-Codierung, kann jede ID bis zu 5 Zeichen von 7 Bits pro Zeichen entspricht 35 Bits oder 2^35 [34 359 738 368] unterschiedliche Werte . Das ist eine ziemlich große Domain. *

Dann wird es eine Frage der Rückgabe eines Wertes für eine gegebene Einreichung. Es gibt wahrscheinlich sehr viele viele Möglichkeiten, dies zu tun, aber ich würde mit so etwas wie dies gehen,

  • Aufzählen alle möglichen Werte innerhalb einer „freien Liste“ in Ihrer Datenbank
  • Wert Entfernen von der Liste frei, wenn verbraucht
  • Wert freie Liste hinzufügen, wenn
  • veröffentlicht

Erweiterungen oder Optimierungen umfassen können

  • Zählen Sie nicht alle Werte im Bereich [0, 2^35] auf, sondern führen Sie eine verwaltbare Teilmenge auf, z. B. 100 000 Werte gleichzeitig, und wenn alle Werte verbraucht sind, generieren Sie einfach weitere 100 000 Werte in der Reihenfolge
  • Add ein Ablaufdatum auf Werte, und abgelaufene Werte am Ende des Tages recyceln
  • Ihren Service vertreiben, wenn der Service einfach austeilen kleine gegenseitig ausschließende Teilmengen Ihrer freien Liste zu verteilten Diensten

Fazit Parallelisierung

Unterm Strich ist, möchten Sie Guara ntee Einzigartigkeit - Kollisionen sind ein großes No-No.


* = 34 359 738 368 die Größe der Raw-Domäne ist, dann ist dies alle IDs von 0 bis 5 Länge Länge. Wenn Sie alle ids auf ein Minimum und Maximum von 5 Länge beschränken möchten, dann sieht Ihre Domain wie alle IDs der Länge 0 bis 5 (2^35) aus, alle Ids der Länge 0 bis 4 (2^28) sind 2^35 - 2^28 = 34 091 302 912, das ist immer noch ziemlich groß :)

-2

Hey nll, wie einige andere Leute dir gesagt haben .. Wenn Sie beginnen, die URL in etwas kleines zu komprimieren, wird es für Sie unmöglich sein halte es einzigartig. Das heißt, Sie müssen Ihre eigene Codierung für jede URL erstellen, die Ihnen übermittelt wird. Eine einfache Möglichkeit ist es, eine Datenbank aus den übergebenen URLs zu erstellen und dann für jedes ein GUID-Feld zu generieren und dann einen Teilstring von ihm zu erhalten, der sicherstellt, dass jedes Mal, wenn Sie etwas registrieren, völlig anders ist.

Zum Beispiel: www.google.com mit der GUID F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4 ->http://www.mysite.com/?q=CEB2

Je mehr Zeichen Sie verwenden, desto mehr Links können Sie verfolgen. Für dieses Beispiel haben Sie 65536 verschiedene Links (mit nur 4 Zeichen auf Hex).

Hoffe, das hilft.

+1

Entschuldigung, -1 zum Abschneiden von Guids. Nur schlechte, schlechte Praxis. Nur eine ganze Guid Es ist garantiert, dass es einzigartig ist.Ein Teil oder eine Teilmenge eines GUIDs zu verwenden, ist nicht wichtig.Ein-kleine-Bit-zählt –

+0

Ich kenne Johnny, und Sie können in keinem meiner Post eine Referenz finden, wo ich eine Untermenge von sage Der Link ist einzigartig ... – rodrigoelp