web-dev-qa-db-fra.com

Existe-t-il un moyen de créer un code unique court comme un GUID court?

Je souhaite créer un court GUID. Existe-t-il un moyen de créer un code unique court comme un GUID court? Je souhaite créer un numéro de suivi de ticket.

27
masoud ramezani

La longueur de GUID est de 128 bits (16 bits), faites si vous voulez créer un court GUID, vous devez changer le codage du GUID.

Par exemple, vous pouvez utiliser base64 ou ASCII85.

    /// <summary>
    /// Creates a GUID which is guaranteed not to equal the empty GUID
    /// </summary>
    /// <returns>A 24 character long 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());
    }
18
JKhuang

Jeff Atwood a un article sur son blog comment raccourcir un GUID à 20 caractères sans perdre d'informations:
Coding Horror: Équiper notre ASCII Armor

13
Christian Specht

unique en un an, visiblement `` aléatoire ''

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('=');
}

en voici un avec un jeu de caractères personnalisable

string UniqueID(string CharList = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
{
    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());
}
5
K. R.

Dépend vraiment de votre utilisation.

Par exemple, si vous les générez à un rythme inférieur à 1 par seconde, vous pouvez simplement incrémenter un entier 32 bits (1/4 de la taille d'un GUID 128 bits). Cela vous durerait un peu plus de 68 ans à raison de 1 par seconde.

Si vous déterminez votre utilisation, il devrait être assez simple de déterminer la taille minimale avec laquelle vous pouvez vous en tirer. Cela dépendra également si vous souhaitez pouvoir les générer n'importe où, ou s'ils seront générés par un seul serveur ou logiciel.

4
mike

Essayez Base 36 , pour obtenir un numéro unique, tout ce que vous avez à faire est d'utiliser un numéro automatique et de l'enregistrer sous Base36. Cependant, pour qu'ils soient aléatoires, vous aurez besoin d'autre chose.

Ce que je vais faire, c'est hacher ou crypter le numéro du billet comme code de suivi du billet. Comme,

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

Si vous voulez que le code de suivi soit unique, je chiffrerai avec certaines clés.

4
Akash Kava