English
Français

Blog of Denis VOITURON

for a better .NET world

Un GUID plus court et plus convivial

Posted on 2022-04-07

Lorsque vous générer du code HTML, vous avez souvent besoin d’un identifiant unique. Un GUID fonctionne très bien mais il est très long (3297F0F2-35D3-4231-919D-1CFCF4035975). Vous pouvez le racourcir mais n’existe-t’il pas une manière plus optimisée (plus rapide) de générer un identifiant en C# ?

Voici une classe contenant plusieurs méthodes.

public class Identifier
{
    private static Random _rnd = new Random();

    // 8da18880a18a4cd
    public string NewId_FromTicks() => DateTime.Now.Ticks.ToString("x");

    // c9a646d3-9c61-4cb7-bfcd-ee2522c8f633
    public string NewId_FromGuid() => Guid.NewGuid().ToString();

    // 1WIXVZtbA0qKPcZ
    public string NewId_FromGuidBase64() => Convert.ToBase64String(Guid.NewGuid().ToByteArray())
                                                    .Replace("/", "_")
                                                    .Replace("+", "-")
                                                    .Substring(0, 15);
    
    // 1WIXVZtbA0qKPcZ
    public string NewId_FromGuidShorted() => Guid.NewGuid().ToString("N").Substring(0, 15);

    // 2c6fec62
    public string NewId_FromRandomInt() => _rnd.Next(int.MaxValue).ToString("x");

    // 127d9edf
    public string NewId_FromRandomLong() => _rnd.Next().ToString("x");
    
    // 127d9edf14385adb
    public string NewId_FromRandomDoubleLong() => $"{_rnd.Next().ToString("x")}{_rnd.Next().ToString("x")}";
}

Le tableau suivant affiche la moyenne du temps d’exécution de ces méthodes, grâce à la librairie de benchmark BenchmarkDotNet.

BenchmarkDotNet=v0.13.1, OS=Windows 8 (6.2.9200.556)
Intel Core i7-1065G7 CPU 1.30GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=6.0.201
  [Host]     : .NET 6.0.3 (6.0.322.12309), X64 RyuJIT
  DefaultJob : .NET 6.0.3 (6.0.322.12309), X64 RyuJIT

| Method           | Example                              |  Mean     |
|------------------|--------------------------------------|-----------|
| From Rnd Long:     10aad4a0                                51.14 ns |
| From Rnd Int:      4a9d0f06                                51.59 ns |
| From Rnd Long:     6aa977f03314e4b4                       115.12 ns |
| From Ticks:        8da188a929219fab                       174.41 ns |
| From Guid Base64:  aRk3NU0b0ka04Oqc                       206.67 ns |
| From Guid:         25ee3842-0c33-4a63-9b83-a7d1c0266809   224.59 ns |
| From Guid Shorted: 6ee0e232196b4a9                        237.51 ns |

Un bon compromis est l’utilisation de la méthode NewId_FromRandomDoubleLong qui retourne une valeur sur 12 caracatères et beaucoup rapidement que le GUID. Cette valeur est acceptable lorsque l’on génère des identifiants depuis un serveur Web ou une application autonome. Il reste préférable d’utiliser un GUID lorsqu’on travaille avec plusieurs serveurs ou des échanges de données entre clients.

Langues

EnglishEnglish
FrenchFrançais

Suivez-moi

Articles récents