C#中Guid类使用小结

2025-07-04 18:50
文章标签 c# guid 小结 使用 netcore .net

本文主要是介绍C#中Guid类使用小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下...

前言

C# 中的 Guid 类(全局唯一标识符,Globally Unique Identifier)用于生成和操作 128 位的唯一标识符。它在需要唯一标识的场景(如数据库主键、分布式系统等)中广泛使用。

一、什么是 Guid

Guid(Globally Unique Identifier,全局唯一标识符)是一种由 128 位(16 字节)组成的唯一标识符。

  • 它通常以 32 个十六进制数字表示,分为 5 组,格式为 8-4-4-4-12xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  • 示例:123e4567-e89b-12d3-a456-426614174000

Guid 的主要用途是为对象、数据库记录等提供一个在全局范围内唯一的标识,避免因重复而导致的冲突问题。

二、生成 Guid

在 C# 中,可以使用 System.Guid 类来生成 Guid。

1. 使用 Guid.NewGuid() 方法

这是最常用的方式,用于生成一个新的随机 Guid。

Guid newGpythonuid = Guid.NewGuid();
Console.WriteLine(newGuid.ToString());

每次调用 Guid.NewGuid() 方法都会生成一个不同的 Guid,它通过复杂的算法确保生成的 Guid 在全球范围内具有极高php的唯一性。

2. 从字符串创建 Guid

如果已经有一个符合 Guid 格式的字符串,可以通过 Guid.Parse 或 Guid.TryParse 方法将其转换为 Guid 对象。

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

Guid.Parse 方法在字符串格式不正确时会抛出异常,而 Guid.TryParse 方法则会返回一个布尔值,表示转换是否成功,避免异常的发生。

string guidString = "123e4567-e89b-12d3-a456-426614174000";
Guid guid;
if (Guid.TryParse(guidStandroidring, out guid))
{
	  Console.WriteLine(guid.ToString());
}
else
{
	  Console.WriteLine("Invalid GUID format.");
}

3. 从构造函数

  • 全零 Guid:Guid.Empty 表示全零的 Guid(00000000-0000-0000-0000-000000000000)。
  • 从字节数组创建 Guid
    • 如果有一个长度为 16 的字节数组,也可以通过 new Guid(byte[]) 构造函数来创建 Guid。
        byte[] bytes = new byte[16];
        
        // 使用随机数填充字节数组
        Random random = new Random();
        random.NextBytes(bytes);
        
        Guid guid = new Guid(bytes);
        Console.WriteLine(guid.ToString());

实例化

  • 使用指定字符串表示的值创建Guid结构。
	 Guid guid = new Guid("123e4567-e89b-12d3-a456-426614174000");
	 Console.WriteLine(guid.ToString());

三、Guid 的属性和方法

1. 全零 Guid

Guid.Empty : 表示全零的 Guid(00000000-0000-0000-0000-000000000000)。

2. Guid.ToString() 格式化

Guid 提供了多种格式化选项,可以通过 ToString 方法并指定格式化字符串来控制输出格式。

  • “N”:不带连字符的32个数字组成的字符hmdjs串。
  • “D”:由连字符分隔的32个数字(默认格式)。
  • “B”:被大括号包围的GUID。
  • “P”:被圆括号包围的GUID。
  • “X”:每个字节由“0x”开头的十六进制字符串组成,整个GUID被大括号包围,并且每两个字节之间有逗号分隔。
	Guid guid = Guid.NewGuid();
	Console.WriteLine(guid.ToString("N")); // 输出类似:3dfdb9e3b8a7445c8634268e71345b9e
	Console.WriteLine(guid.ToString("D")); // 输出类似:3dfdb9e3-b8a7-445c-8634-268e71345b9e
	Console.WriteLine(guid.ToString("B")); // 输出类似:{3dfdb9e3-b8a7-445c-8634-268e71345b9e}
	Console.WriteLine(guid.ToString("P")); // 输出类似:(3dfdb9e3-b8a7-445c-8634-268e71345b9e)
	Console.WriteLine(guid.ToString("X")); // 输出类似:{0x3dfdb9e3,0xb8a7,0x445c,{0x86,0x34,0x26,0x8e,0x71,0x34,0x5b,0x9e}}

3. Guid 的比较

Guid 类提供了多种比较方法,用于比较两个 Guid 是否相等。

  • 使用 Equals 方法
	Guid guid1 = Guid.NewGuid();
	Guid guid2 = guid1;
	bool isEqual = guid1.Equals(guid2);
	Console.WriteLine(isEqual); // 输出:True
  • 使用 == 和 != 运算符
	bool isEqual = guid1 == guid2;
	bool isNotEqual = guid1 != guid2;
	Console.WriteLine(isEqual); // 输出:True
	Console.WriteLine(isNotEqual); // 输出:False
  • 使用 CompareTo 方法
    CompareTo 方法用于比较两个 Guid 的字典顺序。
	int comparisonResult = guid1.CompareTo(guid2);
	if (comparisonResult == 0)
	{
	    Console.WriteLine("Guids are equal.");
	}
	else if (comparisonResult < 0)
	{
	    Console.WriteLine("Guid1 is less than Guid2.");
	}
	else
	{
	    Console.WriteLine("Guid1 is greater than Guid2.");
	}

四、Guid 的存储和传输

由于 Guid 是 128 位的结构,因此在存储和传输时需要考虑其大小和性能。

1. 数据库存储

在数据库中,Guid 通常以 uniqueidentifier 类型存储(在 SQL Server 中)。在实体框架(Entity Framework)中,可以将实体的主键设置为 Guid 类型。

public class MyEntity
{
    public Guid Id { get; set; }
    // 其他属性
}

2. 网络传输

在通过网络传输 Guid 时,通常将其转换为字符串格式,以方便http://www.chinasem.cn传输和解析。

string guidString = guid.ToString();
// 传输 guidString

在接收端,可以使用 Guid.Parse 或 Guid.TryParse 方法将其转换回 Guid 对象。

五、使用场景与注意事项

1. 使用场景

  • 数据库主键
    • GUID常被用作数据库表的主键,尤其是在分布式系统中。由于其独特性,它可以确保跨多个数据库或服务的数据同步问题最小化。替代自增整数,避免主键暴露业务信息。
  • 唯一标识
    • GUID非常适合用于需要保证唯一性的场合,例如用户会话ID、订单编号等。
  • 文件名
    • 在某些情况下,GUID可以用作文件名的一部分,以确保文件名称在全球范围内唯一。

2. 注意事项

  • 性能问题:虽然 Guid 的唯一性很高,但生成 Guid 和比较 Guid 的性能相对较低。在需要大量生成和比较 Guid 的场景中,需要考虑性能优化
  • 随机性与唯一性
    • Guid.NewGuid() 生成的是随机的 Guid,其唯一性基于随机算法。虽然冲突的概率极低,但在极端情况下仍然可能存在冲突。如果需要更高的唯一性,可以考虑使用其他生成策略,例如基于时间戳和机器标识的 Guid 生成算法。
    • 理论上存在重复概率,但极低(每秒生成 10 亿个 Guid,约需 100 年才会重复)。
  • 存储空间:Guid 占用 16 字节的空间,相比整数类型的主键(如 int 或 long),存储空间更大。在存储大量数据时,需要考虑存储空间的开销。
  • 无序性:Guid 无序,作为主键可能导致索引碎片(可考虑顺序 Guid,如 CombGuid,结合时间戳和随机数,优化数据库索引性能。)
  • 安全:随机 Guid 不保证加密安全,需使用 RNGCryptoServiceProvider 生成安全随机数。

七、总结

Guid 是一种非常有用的唯一标识符,在 C# 中可以通过多种方式生成、格式化和比较。它在数据库主键、对象标识、分布式系统中具有广泛的应用。然而,在使用 Guid 时也需要考虑其性能和存储空间的开销,合理选择使用场景。

到此这篇关于C#中Guid类使用小结的文章就介绍到这了,更多相关C# Guid使用内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于C#中Guid类使用小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155304

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四