2009-09-22 25 views
39

È possibile generare un GUID breve come in YouTube (N7Et6c9nL9w)?GUID simile a YouTube

Come può essere fatto? Voglio usarlo nell'app Web.

risposta

38

Si potrebbe utilizzare Base64:

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

che genera una stringa come E1HKfn68Pkms5zsZsvKONw==. Poiché un GUID è sempre a 128 bit, puoi omettere lo == che sai sarà sempre presente alla fine e che ti darà una stringa di 22 caratteri. Tuttavia, questo non è così breve come YouTube.

+21

Questo metodo presenta l'inconveniente che, i valori generati possono contenere il segno barra (/), che può, quando unproperly gestito, essere scomodo per ussage in Url's –

+2

Mentre mi piace molto questa soluzione, sono d'accordo con Jhonny D. non solo '/' può apparire ma anche '+' che interromperà totalmente il tuo url. * sigh * – c0d3p03t

+2

Basta sostituire "/" e "+" con i caratteri sicuri dell'URL, come "-" e "_". Quindi, quando si legge di nuovo il guid, rimettili a posto prima della decodifica. –

3

Tecnicamente non è un Guid. Youtube ha un semplice generatore di stringhe randomizzato che probabilmente puoi montare in pochi minuti usando una matrice di caratteri consentiti e un generatore di numeri casuali.

1

Questo ID probabilmente non è globalmente unico. I GUID devono essere globalmente univoci in quanto includono elementi che non dovrebbero verificarsi altrove (l'indirizzo MAC della macchina che genera l'ID, l'ora in cui è stato generato l'ID, ecc.)

Se quello che ti serve è un ID che è unico all'interno la tua applicazione usa una fontana numerica, magari codificando il valore come un numero esadecimale. Ogni volta che hai bisogno di un ID, prendilo dalla fontana numero.

Se si dispone di più server che allocano gli ID, è possibile ottenere un intervallo di numeri (poche decine o migliaia a seconda della velocità con cui si stanno allocando gli ID) e questo dovrebbe essere il lavoro. un numero esadecimale di 8 cifre ti darà 4 miliardi di ID, ma i tuoi primi ID saranno molto più brevi.

10

9 caratteri non è un Guid. Detto questo, è possibile utilizzare la rappresentazione esadecimale di un int, che fornisce una stringa di 8 caratteri.

Update 1: Non so il motivo per cui quanto sopra ottenuto un downvote, ma per chiunque chiedendo:

È possibile utilizzare un ID si potrebbe già avere. Inoltre puoi usare. GetCashCode contro diversi tipi semplici e lì hai un int diverso. Puoi anche scegliere tra diversi campi. E se ci sei, potresti anche usare un numero casuale - hey, hai ben oltre 2.000.000.000 di valori possibili se ti attacchi ai lati positivi;)

+0

Mi chiedo anche che ... in ogni caso, ho appena pubblicato un aggiornamento che dà ulteriori ragioni per fare il contrario - upvote :) – eglasius

3

Potrebbe non essere la soluzione migliore, ma puoi fare qualcosa di simile:

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

L'unico problema con questo metodo è che il secondo argomento è in realtà per il numero minimo di non - caratteri alfabetici e non numerici. Quando provo con '0' ottengo diversi simboli di questo tipo ... – Azimuth

4

come altri hanno detto, di YouTube VideoId non è tecnicamente un GUID dato che non è di per sé unico.

Secondo Wikipedia:

Il numero totale di chiavi univoche è 2 o 3.4 × 10 . Questo numero è così grande che la probabilità che lo stesso numero venga generato in modo casuale due volte è trascurabile.

L'unicità YouTube VideoId viene gestito dall'algoritmo del generatore.

È possibile scrivere il proprio algoritmo, oppure è possibile utilizzare una sorta di generatore di stringhe casuali e utilizzare il vincolo UNIQUE CONSTRAINT in SQL per far rispettare la propria univocità.

In primo luogo, creare un UNIQUE CONSTRAINT nel database:

ALTER TABLE MyTable 
ADD CONSTRAINT UniqueUrlId 
UNIQUE (UrlId); 

Quindi, ad esempio, generare una stringa casuale (da philipproplesch di answer):

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

Se il generato UrlId è abbastanza casuale e abbastanza a lungo si dovrebbe raramente incontrare l'eccezione che viene generata quando SQL incontra un duplicato UrlId. In tal caso, puoi gestire facilmente l'eccezione nella tua app web.

+0

L'unico problema con il metodo' GeneratePassword' è che il secondo argomento è in realtà per il numero minimo di caratteri non alfabetici e non numerici. Quando provo con '0' ottengo molti di questi simboli ... – Azimuth

5

Come menzionato nella risposta accettata, può causare problemi se si utilizza il GUID nell'URL. Ecco una risposta più completa:

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); 
    } 

utilizzati:

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