2009-09-22 13 views
39

Ist es möglich, kurze GUID wie in YouTube (N7Et6c9nL9w) zu generieren?YouTube-ähnliche GUID

Wie kann es gemacht werden? Ich möchte es in der Web App verwenden.

Antwort

38

Sie könnten Base64 verwenden:

string base64Guid = Convert.ToBase64String(Guid.NewGuid().ToByteArray()); 

, die eine Zeichenfolge wie E1HKfn68Pkms5zsZsvKONw== erzeugt. Da eine GUID immer 128 Bits ist, können Sie die == weglassen, von der Sie wissen, dass sie immer am Ende vorhanden sein wird und die Ihnen eine Zeichenfolge mit 22 Zeichen geben wird. Das ist nicht so kurz wie YouTube.

+21

Dieses Verfahren hat den Nachteil, dass die generierten Werte der Slash (/) Zeichen enthalten, die können, wenn unproperly behandelt, unbequem sein für ussage in Urls –

+2

Während ich wirklich diese Lösung mag, stimme ich mit Jhonny D. nicht nur '/' kann aber auch '+' erscheinen, die Ihre URL völlig brechen wird. * seufz * – c0d3p03t

+2

Ersetzen Sie einfach '/' und '+' durch URL-sichere Zeichen wie '-' und '_'. Wenn Sie die GUID dann wieder einlesen, ersetzen Sie sie vor dem Decodieren wieder. –

3

Technisch ist es kein Guid. Youtube hat einen einfachen zufallsgenerierten String-Generator, den Sie wahrscheinlich in wenigen Minuten mit einem Array von erlaubten Zeichen und einem Zufallsgenerator erzeugen können.

1

Diese ID ist wahrscheinlich nicht global eindeutig. GUIDs sollten global eindeutig sein, da sie Elemente enthalten, die nirgendwo anders vorkommen sollten (die MAC-Adresse des Rechners, der die ID erzeugt, die Zeit, zu der die ID generiert wurde)

Wenn Sie eine ID benötigen, die innerhalb dieser eindeutig ist Verwenden Sie einen Zahlenbrunnen - vielleicht kodieren Sie den Wert als Hexadezimalzahl. Jedes Mal, wenn du eine ID brauchst, nimm sie vom Nummernbrunnen.

Wenn Sie mehrere Server haben, die IDs zuweisen, können Sie eine Reihe von Zahlen abrufen (einige zehn oder Tausende, je nachdem, wie schnell Sie IDs zuweisen), und das sollte die Aufgabe erledigen. Eine 8-stellige Hex-Zahl gibt Ihnen 4 Milliarden IDs - aber Ihre erste ID wird viel kürzer sein.

10

9 Zeichen ist kein Guid. In Anbetracht dessen könnten Sie die hexadezimale Darstellung eines int verwenden, die Ihnen eine Zeichenfolge mit 8 Zeichen liefert.

Update 1: Keine Ahnung, warum bekam die oben eine downvote, aber für jemand fragen:

Sie können eine ID verwenden Sie vielleicht schon haben. Sie können auch .GetHashCode gegen verschiedene einfache Typen verwenden und dort haben Sie einen anderen Int. Sie können auch verschiedene Felder bearbeiten. Und wenn Sie daran interessiert sind, könnten Sie sogar eine Zufallszahl verwenden - hey, Sie haben weit über 2.000.000.000+ mögliche Werte, wenn Sie sich an die positiven halten;)

+0

Ich frage mich auch, dass ... auf jeden Fall, ich habe gerade ein Update geben, die gibt zusätzliche Gründe, das Gegenteil zu tun - upvote :) – eglasius

3

Es könnte nicht die beste Lösung sein, aber Sie können so etwas tun:

string shortUrl = System.Web.Security.Membership.GeneratePassword(11, 0); 
+0

Das einzige Problem mit dieser Methode ist, dass das zweite Argument ist eigentlich für die Mindestanzahl von nicht -Alphabetische und Nicht-Nummer-Zeichen. Wenn ich mit "0" versuche, bekomme ich mehrere solche Symbole ... – Azimuth

4

wie andere erwähnt haben, VideoId YouTube ist technisch nicht eine GUID, da es nicht von Natur aus einzigartig ist.

Wie pro Wikipedia:

Die Gesamtzahl der eindeutigen Schlüssel 2 oder 3,4 × 10 38 . Diese Zahl ist so groß, dass die Wahrscheinlichkeit, dass die gleiche Zahl zufällig zweimal generiert wird, ist, vernachlässigbar.

Die Einzigartigkeit YouTube VideoId wird von ihrem Generator-Algorithmus beibehalten.

Sie können entweder Ihren eigenen Algorithmus schreiben, oder Sie können eine Art Zufallsgenerator verwenden und die UNIQUE CONSTRAINT-Einschränkung in SQL verwenden, um ihre Eindeutigkeit zu erzwingen.

zunächst ein UNIQUE CONSTRAINT in Ihrer Datenbank erstellen:

ALTER TABLE MyTable 
ADD CONSTRAINT UniqueUrlId 
UNIQUE (UrlId); 

Dann zum Beispiel erzeugt eine zufällige Zeichenfolge (aus philipproplesch dem answer):

string shortUrl = System.Web.Security.Membership.GeneratePassword(11, 0); 

Wenn die erzeugen UrlId ausreichend zufällig ist und ausreichend lang sollten Sie selten auf die Ausnahme stoßen, die ausgelöst wird, wenn SQL auf ein Duplikat UrlId trifft. In einem solchen Fall können Sie die Ausnahme in Ihrer Web-App problemlos verarbeiten.

+0

Das einzige Problem mit der Methode 'GeneratePassword' ist, dass das zweite Argument tatsächlich für die minimale Anzahl von nicht-alphabetischen und nicht-nummerischen Zeichen ist. Wenn ich mit "0" versuche, bekomme ich mehrere solche Symbole ... – Azimuth

5

Wie in der angenommenen Antwort erwähnt, kann es Probleme machen, wenn Sie die GUID in der URL verwenden. Hier ist eine vollständigere Antwort:

public string ToShortString(Guid guid) 
    { 
     var base64Guid = Convert.ToBase64String(guid.ToByteArray()); 

     // Replace URL unfriendly characters with better ones 
     base64Guid = base64Guid.Replace('+', '-').Replace('/', '_'); 

     // Remove the trailing == 
     return base64Guid.Substring(0, base64Guid.Length - 2); 
    } 

    public Guid FromShortString(string str) 
    { 
     str = str.Replace('_', '/').Replace('-', '+'); 
     var byteArray = Convert.FromBase64String(str + "=="); 
     return new Guid(byteArray); 
    } 

Verbrauch:

 var guid = Guid.NewGuid(); 
     var shortStr = ToShortString(guid); 
     // shortStr will look something like 2LP8GcHr-EC4D__QTizUWw 
     var guid2 = FromShortString(shortStr); 
     Assert.AreEqual(guid, guid2);