Sie sind hier: Weblog

Neu in .NET 9.0 [12]: GUID-Version 7 mit CreateVersion7()

Foto Dr. Holger Schwichtenberg, Dr. Holger Schwichtenberg
14.03.2025 17:03:00

Die .NET-Klasse System.Guid bietet seit .NET 9.0 neben der statischen Methode NewGuid(), die einen Globally Unique Identifier (GUID), alias UUID (Universally Unique Identifier), gemäß RFC 9562 mit reinen Zufallszahlen (Version 4) erzeugt, nun auch eine weitere statische Methode CreateVersion7() mit einem Timestamp und einer Zufallszahl.

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Folgender Code zeigt sowohl den Einsatz von NewGuid() als auch den von CreateVersion7():

public void Run()
{
 CUI.Demo(nameof(FCL9_Guid));
 
 for (int i = 0; i < 10; i++)
 {
  Guid guid = Guid.NewGuid();
  Console.WriteLine($"Guid v4:\t{guid}");
 }
 
 for (int i = 0; i < 10; i++)
 {
  Guid guid7 = Guid.CreateVersion7();
  Console.WriteLine($"Guid v7:\t{guid7}");
 }
 CUI.Yellow("Warte 1 Sekunde...");
 Thread.Sleep(1000);
 for (int i = 0; i < 10; i++)
 {
  Guid guid7 = Guid.CreateVersion7();
  Console.WriteLine($"Guid v7:\t{guid7}");
 }
}

Die Ausgabe zu dem Listing zeigt, dass die GUIDs in Version 7 sich aufgrund des enthaltenen Timestamps ähnlich sind.

(Bild: Screenshot (Holger Schwichtenberg))

Der Timestamp ist in UTC-Zeit in den ersten 64 Bits der GUID enthalten.

Zum Extrahieren des Zeitpunkts gibt es keine eingebaute Methode, man kann ihn aber folgendermaßen extrahieren:

public DateTimeOffset GetDateTimeOffset(Guid guid)
{
 byte[] bytes = new byte[8];
 guid.ToByteArray(true)[0..6].CopyTo(bytes, 2);
 if (BitConverter.IsLittleEndian)
 {
  Array.Reverse(bytes);
 }
 long ms = BitConverter.ToInt64(bytes);
 return DateTimeOffset.FromUnixTimeMilliseconds(ms);
}

(rme)