程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

C# 中 GUID 的全面解析:生成、格式化、V7版本与应用场景

balukai 2025-05-22 09:12:56 文章精选 1 ℃

1. 什么是 GUID?

GUID(Globally Unique Identifier,全局唯一标识符)是一种 128 位的数字,用于标识全局范围内唯一的对象。常用于数据库表中的主键、分布式系统中的唯一标识符、软件组件的标识等场景。

在 C# 中,System.Guid 类提供了对 GUID 的生成和操作支持。GUID 的主要特点包括:

  • o 唯一性:理论上,生成的 GUID 是全局唯一的。
  • o 固定长度:GUID 的长度为 128 位(16 字节)。
  • o 多种格式:GUID 可以以多种格式输出,适应不同的使用场景。

从 .NET 9 开始的新特性:Guid V7

.NET 9 引入了基于时间戳和随机值的 Guid 版本 7(Guid V7),使其更适合关系型数据库。Guid V7 的值是顺序的,减少了数据库索引的碎片化,从而提高了性能。

Guid guid7 = Guid.CreateVersion7();
Console.WriteLine(guid7);

2. 如何生成 GUID?

2.1 使用Guid.NewGuid()

Guid.NewGuid() 是生成 GUID 的最常用方法:

using System;

Guid guid = Guid.NewGuid();
Console.WriteLine("生成的 GUID: " + guid); 
// 示例输出: 3F2504E0-4F89-11D3-9A0C-0305E82C3301

2.2 从字符串转换为 GUID

可以通过 Guid.ParseGuid.TryParse 将字符串转换为 GUID:

string guidString = "123e4567-e89b-12d3-a456-426614174000";
Guid guid = Guid.Parse(guidString);
Console.WriteLine(guid.ToString());

2.3 从字节数组创建 GUID

byte[] bytes = new byte[16];
Random random = new Random();
random.NextBytes(bytes);
Guid guid = new Guid(bytes);
Console.WriteLine(guid.ToString());

3. GUID 的格式化输出

GUID 支持多种格式化输出方式,可以通过 ToString 方法指定格式:

3.1 常见格式化选项

格式化选项描述示例输出D默认格式,带连字符的 32 个字符f368a3ad-d7df-4655-a41a-e610a6c7ae83N不带连字符的 32 个字符f368a3add7df4655a41ae610a6c7ae83B被大括号包围的 GUID{f368a3ad-d7df-4655-a41a-e610a6c7ae83}P被圆括号包围的 GUID(f368a3ad-d7df-4655-a41a-e610a6c7ae83)X十六进制格式,带大括号和逗号分隔{0xf368a3ad,0xd7df,0x4655,{0xa4,0x1a,...}}

3.2 示例

Guid guid = Guid.NewGuid();

Console.WriteLine("Default (D): " + guid.ToString("D"));
Console.WriteLine("No Dashes (N): " + guid.ToString("N"));
Console.WriteLine("Braces (B): " + guid.ToString("B"));
Console.WriteLine("Parentheses (P): " + guid.ToString("P")); 
Console.WriteLine("Uppercase Hex (X): " + guid.ToString("X"));

运行结果:

Default (D): f368a3ad-d7df-4655-a41a-e610a6c7ae83
No Dashes (N): f368a3add7df4655a41ae610a6c7ae83
Braces (B): {f368a3ad-d7df-4655-a41a-e610a6c7ae83}
Parentheses (P): (f368a3ad-d7df-4655-a41a-e610a6c7ae83)
Uppercase Hex (X): {0xf368a3ad,0xd7df,0x4655,{0xa4,0x1a,...}}

3.3 全零 GUID

Guid.Empty 表示全零的 GUID:

Console.WriteLine(Guid.Empty);
// 输出: 00000000-0000-0000-0000-000000000000

4. GUID 的常见应用场景

  1. 1. 数据库主键
    GUID 常用于分布式数据库的主键,避免 ID 冲突。Guid V7 的顺序特性进一步优化了数据库索引性能。
  2. 2. COM 组件标识
    在 COM 编程中,GUID 用于标识接口和类。
  3. 3. 文件或资源标识
    GUID 可用于为文件、资源或会话分配唯一标识符。
  4. 4. 分布式系统
    在分布式系统中,GUID 是标识不同节点或对象的理想选择。

5. 为什么选择 Guid V7?

Guid V7 是 .NET 9 引入的新特性,解决了传统 GUID 的一些局限性:

  • o 顺序性:基于时间戳的顺序特性,减少了数据库索引的碎片化。
  • o 性能优化:在关系型数据库中插入和查询性能更高。
  • o 兼容性:仍然是标准的 128 位 GUID,兼容现有系统。

默认创建:
它默认使用当前 UTC 时间

Guid guid7 = Guid.CreateVersion7();
Console.WriteLine("Guid V7: " + guid7);
//Guid V7: 0196321a-07a3-74b6-b7d1-516a9d5dc247

指定时间戳创建:

DateTimeOffset timestamp = DateTimeOffset.UtcNow;
Guid guid7WithTimestamp = Guid.CreateVersion7(timestamp);
Console.WriteLine(guid7WithTimestamp);
//01963219-b06e-7230-a9f6-2eba45fa94ef

6. 总结

GUID 是一种强大的工具,用于生成全局唯一标识符。在 C# 中,System.Guid 类提供了简单易用的接口来生成和格式化 GUID。随着 .NET 9 引入 Guid V7,GUID 的性能和适用性得到了进一步提升。

最近发表
标签列表