Global Unique Identifier in .NET, C# und Visual Basic formatieren

Der Dotnet-Doktor  –  9 Kommentare

Auch wenn im .NET Framework GUIDs (Global Unique Identifier) nicht mehr zur Identifikation von Schnittstellen und Klassen zum Einsatz kommen, haben diese 128 Bit langen Zahlen dort weiterhin viele Einsatzgebiete, zum Beispiel zur eindeutigen Identifikation verteilt erzeugter Datensätzer oder zur eindeutigen Identifikation für eine Benutzersitzung. Vorsicht ist aber geboten bei der grundsätzlichen Verwendung von GUIDs als Primärschlüssel in Datenbanktabellen hinsichtlich Performance und Speicherverbrauch!

Im .NET Framework eingebaut ist die Klasse System.Guid. In diesen Tagen kam in einem meiner Kundenprojekte die Diskussion auf, wie viele Zeichen eine GUID denn umfasst. Die richtige Antwort ist wie so oft in der IT: Es hängt davon ab!

Es gibt verschiedene Formatierungen für eine GUID, sodass diese zwischen 32 und 68 Zeichen verbraucht:

var g = Guid.NewGuid();
Console.WriteLine(g.ToString()); // => 36 Zeichen mit Bindestrichen: 12345678-1234-1234-1234-123456789abc
Console.WriteLine(g.ToString("D")); // wie to String()
Console.WriteLine(g.ToString("N")); // => 32 Zeichen, ohne Bindestriche: 12345678123412341234123456789abc
Console.WriteLine(g.ToString("B")); // => 38 Zeichen mit Bindestrichen und geschweiften Klammern: {12345678-1234-1234-1234-123456789abc}
Console.WriteLine(g.ToString("P")); // => 38 Zeichen mit Bindestrichen und runde Klammern(12345678-1234-1234-1234-123456789abc)
Console.WriteLine(g.ToString("X")); // => 68 Zeichen, Hexadecimal und geschweifte Klammern: {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}

Naheliegend wäre auch, die GUID als Ganzzahl statt als Zeichenkette zu behandeln. Allerdings kann keine der Standardklasse im .NET Framework (System.Int32, System.Int64) die 128 Bit aufnehmen. Das kann nur die erst in .NET 4.0 eingeführte Klasse BigInteger in der Assembly System.Numerics.dll. Eine Konvertierungsmethode von Guid zu BigInteger ist nicht in .NET eingebaut. Das nachfolgende Listing zeigt eine Erweiterungsmethode für die Klasse Guid, die nach BigInteger konvertiert.

  /// <summary>
/// Erweiterungsmethode für die Klasse Guid, die nach BigInteger konvertiert.
/// Erfordert Referenz auf System.Numerics
/// </summary>
/// <param name="guid">GUID</param>
/// <returns>Zahl als BigInteger</returns>
public static System.Numerics.BigInteger ToBigInteger(this Guid guid)
{
var s = guid.ToString("N"); // 32 Zeichen, ohne Bindestriche
var result = System.Numerics.BigInteger.Parse(s, System.Globalization.NumberStyles.AllowHexSpecifier);
result = result > 0 ? result : -result;
if (result < int.MaxValue)
{
result = result + int.MaxValue;
}
return result;
}
}

Diese Erweiterungsmethode kann man so nutzen:

var g = Guid.NewGuid(); 
System.Numerics.BigInteger bi = g.ToBigInteger();
Console.WriteLine(bi);