2009-09-22 21 views

Respuesta

38

Se puede usar Base 64:

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

Eso genera una cadena como E1HKfn68Pkms5zsZsvKONw==. Como un GUID siempre tiene 128 bits, puede omitir el == que sabe que siempre estará presente al final y que le dará una cadena de 22 caracteres. Sin embargo, esto no es tan corto como YouTube.

+21

Este método tiene el inconveniente de que, los valores generados pueden contener el signo de barra (/), que puede, cuando maneja inapropiadamente, ser un inconveniente para el uso en Url's –

+2

Aunque realmente me gusta esta solución, estoy de acuerdo con Jhonny D. No solo '/' puede aparecer sino también '+' lo que romperá por completo su url. * suspiro * – c0d3p03t

+2

Simplemente reemplace el '/' y '+' con caracteres URL seguros, como '-' y '_'. Luego, cuando vuelva a leer la guía, reemplácelos antes de decodificar. –

3

Técnicamente no es un Guid. Youtube tiene un generador de cadenas aleatorias simple que probablemente puedas utilizar rápidamente en pocos minutos usando una serie de caracteres permitidos y un generador de números aleatorios.

1

Esta identificación probablemente no sea globalmente única. Los GUID deben ser únicos en todo el mundo, ya que incluyen elementos que no deberían aparecer en otros lugares (la dirección MAC de la máquina que genera el ID, el momento en que se generó el ID, etc.)

Si lo que necesita es un ID único dentro su aplicación, use una fuente numérica, tal vez codifique el valor como un número hexadecimal. Cada vez que necesites una identificación, cógetela de la fuente numérica.

Si tiene varios servidores que asignan identificadores, puede tomar un rango de números (algunas decenas o miles dependiendo de qué tan rápido esté asignando identificadores) y eso debería hacer el trabajo. un número hexadecimal de 8 dígitos le dará 4 mil millones de ids, pero su primera identificación será mucho más corta.

10

9 caracteres no es un Guid. Dado que, puedes usar la representación hexadecimal de un int, que te da una cadena de 8 caracteres.

Actualización 1: No sé por qué lo anterior consiguió un downvote, pero para cualquiera que se pregunte:

Se puede utilizar un identificador que pueda tener. También puedes usar .GetHashCode contra diferentes tipos simples y allí tienes un int diferente. También puede xor diferentes campos. Y si te gusta, incluso puedes usar un número Aleatorio - hey, tienes más de 2.000.000,000 de valores posibles si te apegas a lo positivo;)

+0

También me pregunto que ... en cualquier caso, acabo de publicar una actualización dando que da razones adicionales para hacer lo contrario - upvote :) – eglasius

3

Puede que no sea la mejor solución, pero puedes hacer algo así:

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

El único problema con este método es que el segundo argumento es en realidad para el número mínimo de no -caracteres alfabéticos y no numéricos. Cuando intento con '0' obtengo varios de esos símbolos ... – Azimuth

4

como otros han mencionado, de YouTube VideoId no es técnicamente un GUID ya que no es intrínsecamente único.

Según Wikipedia:

El número total de claves únicas es 2 o 3,4 × 10 . Este número es tan grande que la probabilidad de que se genere el mismo número aleatoriamente dos veces es insignificante.

La singularidad de YouTube VideoId se mantiene mediante el algoritmo de su generador.

Puede escribir su propio algoritmo, o puede usar algún tipo de generador de cadenas aleatorias y utilizar la restricción UNIQUE CONSTRAINT en SQL para imponer su unicidad.

En primer lugar, crear un UNIQUE CONSTRAINT en su base de datos:

ALTER TABLE MyTable 
ADD CONSTRAINT UniqueUrlId 
UNIQUE (UrlId); 

Entonces, por ejemplo, generar una cadena aleatoria (de philipproplesch de answer):

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

Si el UrlId generada es suficientemente aleatoria y suficientemente largo, rara vez se encontrará con la excepción que se produce cuando SQL encuentra un duplicado UrlId. En tal caso, puede manejar fácilmente la excepción en su aplicación web.

+0

El único problema con el método' GeneratePassword' es que el segundo argumento es en realidad para el número mínimo de caracteres no alfabéticos y sin número. Cuando intento con '0' obtengo varios de esos símbolos ... – Azimuth

5

Como se menciona en la respuesta aceptada, puede causar problemas si usa el GUID en la URL. Aquí es una respuesta más 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); 
    } 

Uso:

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