1. 什么是 GUID?
GUID(Globally Unique Identifier,全局唯一标识符)是一种 128 位的数字,用于标识全局范围内唯一的对象。常用于数据库表中的主键、分布式系统中的唯一标识符、软件组件的标识等场景。
在 C# 中,System.Guid 类提供了对 GUID 的生成和操作支持。GUID 的主要特点包括:
• 唯一性:理论上,生成的 GUID 是全局唯一的。• 固定长度:GUID 的长度为 128 位(16 字节)。• 多种格式:GUID 可以以多种格式输出,适应不同的使用场景。从 .NET 9 开始的新特性:Guid V7.NET 9 引入了基于时间戳和随机值的 Guid 版本 7(Guid V7),使其更适合关系型数据库。Guid V7 的值是顺序的,减少了数据库索引的碎片化,从而提高了性能。
代码语言:javascript复制Guid guid7 = Guid.CreateVersion7();
Console.WriteLine(guid7);2. 如何生成 GUID?2.1 使用 Guid.NewGuid()Guid.NewGuid() 是生成 GUID 的最常用方法:
代码语言:javascript复制using System;
Guid guid = Guid.NewGuid();
Console.WriteLine("生成的 GUID: " + guid);
// 示例输出: 3F2504E0-4F89-11D3-9A0C-0305E82C33012.2 从字符串转换为 GUID可以通过 Guid.Parse 或 Guid.TryParse 将字符串转换为 GUID:
代码语言:javascript复制string guidString = "123e4567-e89b-12d3-a456-426614174000";
Guid guid = Guid.Parse(guidString);
Console.WriteLine(guid.ToString());2.3 从字节数组创建 GUID代码语言:javascript复制byte[] bytes = new byte[];
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-e610a6c7ae83
N
不带连字符的 32 个字符
f368a3add7df4655a41ae610a6c7ae83
B
被大括号包围的 GUID
{f368a3ad-d7df-4655-a41a-e610a6c7ae83}
P
被圆括号包围的 GUID
(f368a3ad-d7df-4655-a41a-e610a6c7ae83)
X
十六进制格式,带大括号和逗号分隔
{0xf368a3ad,0xd7df,0x4655,{0xa4,0x1a,...}}
3.2 示例代码语言:javascript复制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"));运行结果:
代码语言:javascript复制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 全零 GUIDGuid.Empty 表示全零的 GUID:
代码语言:javascript复制Console.WriteLine(Guid.Empty);
// 输出: 00000000-0000-0000-0000-0000000000004. GUID 的常见应用场景1. 数据库主键
GUID 常用于分布式数据库的主键,避免 ID 冲突。Guid V7 的顺序特性进一步优化了数据库索引性能。2. COM 组件标识
在 COM 编程中,GUID 用于标识接口和类。3. 文件或资源标识
GUID 可用于为文件、资源或会话分配唯一标识符。4. 分布式系统
在分布式系统中,GUID 是标识不同节点或对象的理想选择。5. 为什么选择 Guid V7?Guid V7 是 .NET 9 引入的新特性,解决了传统 GUID 的一些局限性:
• 顺序性:基于时间戳的顺序特性,减少了数据库索引的碎片化。• 性能优化:在关系型数据库中插入和查询性能更高。• 兼容性:仍然是标准的 128 位 GUID,兼容现有系统。默认创建:
它默认使用当前 UTC 时间
代码语言:javascript复制Guid guid7 = Guid.CreateVersion7();
Console.WriteLine("Guid V7: " + guid7);
//Guid V7: 0196321a-07a3-74b6-b7d1-516a9d5dc247指定时间戳创建:
代码语言:javascript复制DateTimeOffset timestamp = DateTimeOffset.UtcNow;
Guid guid7WithTimestamp = Guid.CreateVersion7(timestamp);
Console.WriteLine(guid7WithTimestamp);
//01963219-b06e-7230-a9f6-2eba45fa94ef6. 总结GUID 是一种强大的工具,用于生成全局唯一标识符。在 C# 中,System.Guid 类提供了简单易用的接口来生成和格式化 GUID。随着 .NET 9 引入 Guid V7,GUID 的性能和适用性得到了进一步提升。