2011-11-14 70 views
25

Quiero crear un GUID corto. ¿Hay alguna forma de crear un código corto único como corto GUID? Quiero crear un número de seguimiento de boletos.¿Hay alguna manera de crear un código corto único como corto GUID?

+3

Cuanto más corto es, cuanto menos singular que es (señalando que Guid no es realmente "único"). ¿Qué corto? y podría provenir de, digamos, una clave de identidad de la base de datos? –

+0

¿Hay algún motivo por el que un GUID no funcione? –

+0

¿Qué tal si utilizas partes de un guid? –

Respuesta

4

realmente depende de su uso.

Por ejemplo, si los generara a un ritmo inferior a 1 por segundo, podría simplemente incrementar un int de 32 bits (1/4 del tamaño de un GUID de 128 bits). Eso te duraría un poco más de 68 años a razón de 1 por segundo.

Si calcula su uso, debería ser bastante simple calcular el tamaño mínimo que puede obtener. También dependerá de si desea poder generarlos en cualquier lugar, o si serán generados por un único servidor o pieza de software.

4

Pruebe Base 36, para obtener un número único todo lo que tiene que hacer es usar un número automático y guardarlo como Base36. Sin embargo, para que sean aleatorios, necesitarás algo más.

Lo que haré es, hash o encriptar el número de ticket como código de seguimiento de tickets. código como,

code = Base36(MD5(ticketID+"my secrete")); 

Si usted quiere el seguimiento sea único, entonces voy a cifrar con algunas teclas.

17

La longitud del GUID es de 128bits (16bytes), por lo que si desea crear un GUID corto, debe cambiar la codificación del GUID.

Por ejemplo, puede usuario base64 o ASCII85.

/// <summary> 
    /// Creates a GUID which is guaranteed not to equal the empty GUID 
    /// </summary> 
    /// <returns>A string</returns> 
    public static string CreateGuid() 
    { 
     Guid guid = Guid.Empty; 
     while (Guid.Empty == guid) 
     { 
      guid = Guid.NewGuid(); 
     } 

     // Uses base64 encoding the guid.(Or ASCII85 encoded) 
     // But not recommend using Hex, as it is less efficient. 
     return Convert.ToBase64String(guid.ToByteArray()); 
    } 
5

única dentro de un año, de forma visible 'al azar'

string UniqueID() 
{ 
    var t = DateTime.UtcNow; 
    long dgit = t.Millisecond * 1000000000L + 
       t.DayOfYear  * 1000000L + 
       t.Hour   * 10000L + 
       t.Minute  * 100L + 
       t.Second; 
    return Convert.ToBase64String(BitConverter.GetBytes(dgit).Take(5).ToArray()).TrimEnd('='); 
} 

aquí está uno con un personaje personalizable establecer

string UniqueID(string CharList = "ABCDEFGHIJKLMNOPQRSTUVWXYZ") 
{ 
    var t = DateTime.UtcNow; 
    char[] charArray = CharList.ToCharArray(); 
    var result = new Stack<char>(); 

    var length = charArray.Length; 

    long dgit = 1000000000000L + 
       t.Millisecond * 1000000000L + 
       t.DayOfYear  * 1000000L + 
       t.Hour   * 10000L + 
       t.Minute  * 100L + 
       t.Second; 

    while (dgit != 0) 
    { 
     result.Push(charArray[dgit % length]); 
     dgit /= length; 
    } 
    return new string(result.ToArray()); 
} 
+1

se está acabando el tiempo ..... –

Cuestiones relacionadas