当前位置: 首页 > article >正文

C# 中 Guid类 使用详解

总目录


前言

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 newGuid = Guid.NewGuid();Console.WriteLine(newGuid.ToString());

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

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(guidString, 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个数字组成的字符串。
  • “D”:由连字符分隔的32个数字(默认格式)。
  • “B”:被大括号包围的GUID。
  • “P”:被圆括号包围的GUID。
  • “X”:每个字节由“0x”开头的十六进制字符串组成,整个GUID被大括号包围,并且每两个字节之间有逗号分隔。
	Guid guid = Guid.NewGuid();Console.WriteLine(guid.ToString("N")); // 输出类似:3dfdb9e3b8a7445c8634268e71345b9eConsole.WriteLine(guid.ToString("D")); // 输出类似:3dfdb9e3-b8a7-445c-8634-268e71345b9eConsole.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); // 输出:TrueConsole.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 时,通常将其转换为字符串格式,以方便传输和解析。

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#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。

相关文章:

C# 中 Guid类 使用详解

总目录 前言 C# 中的 Guid 类&#xff08;全局唯一标识符&#xff0c;Globally Unique Identifier&#xff09;用于生成和操作 128 位的唯一标识符。它在需要唯一标识的场景&#xff08;如数据库主键、分布式系统等&#xff09;中广泛使用。 一、什么是 Guid Guid&#xff08…...

生产环境的 MySQL事务隔离级别

MySQL 数据库的默认隔离级别是 RR( 可重复读 )&#xff0c;但是很多大公司把隔离级别改成了 RC(读已提交)&#xff0c;主要原因是为了提高并发和降低死锁概率 为了解决幻读的问题 RR 相比 RC 多了间隙锁( gap lock )和临键锁( next-keylock )。而 RC 中修改数据仅用行锁&#…...

无用知识研究:std::initializer_list的秘密

先说结论&#xff0c;用std::initializer_list初始化vector&#xff0c;内部逻辑是先生成了一个临时数组&#xff0c;进行了拷贝构造&#xff0c;然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化&#xff0c;这个动作又触发了拷贝…...

web安全:任意文件下载漏洞

背景&#xff1a; 点击对应名字&#xff0c;下载对应图片。但服务器还存在其他文件&#xff0c;只是前端没有展示出来。通过模拟路径下载&#xff0c;可以获取到意想不到的数据。 看点击代码&#xff1a; 如果模拟没有前端的图片&#xff0c;也会发现下载了 所以这个叫任…...

oracle:索引(B树索引,位图索引,分区索引,主键索引,唯一索引,联合索引/组合索引,函数索引)

索引通过存储列的排序值来加快对表中数据的访问速度&#xff0c;帮助数据库系统快速定位到所需数据&#xff0c;避免全表扫描 B树索引(B-Tree Index) B树索引是一种平衡树结构&#xff0c;适合处理范围查询和精确查找。它的设计目标是保持数据有序&#xff0c;并支持高效的插入…...

大模型实战篇之Deepseek二、一键部署DeepSeek-V3和DeepSeek-R1模型

一键部署DeepSeek-V3和DeepSeek-R1模型:3步,0代码! 随着人工智能技术的飞速发展,越来越多的企业和开发者希望将强大的AI模型快速应用到实际业务中。DeepSeek作为一款高性能的语言模型,已经在多个领域展现出巨大的应用潜力。然而,传统的模型部署流程往往复杂且耗时。今天,…...

【CPP】CPP经典面试题

文章目录 引言1. C 基础1.1 C 中的 const 关键字1.2 C 中的 static 关键字 2. 内存管理2.1 C 中的 new 和 delete2.2 内存泄漏 3. 面向对象编程3.1 继承和多态3.2 多重继承 4. 模板和泛型编程4.1 函数模板4.2 类模板 5. STL 和标准库5.1 容器5.2 迭代器 6. 高级特性6.1 移动语义…...

Windows 中学习Docker环境准备2、Docker Desktop中安装ubuntu

Windows 中学习Docker环境准备1、Win11安装Docker Desktop Windows 中学习Docker环境准备2、Docker Desktop中安装ubuntu Windows 中学习Docker环境准备3、在Ubuntu中安装Docker 需要更多Docker学习视频和资料&#xff0c;请文末联系 一、安装 Docker Desktop 下载 Docker…...

C++11详解(三) -- 可变参数模版和lambda

文章目录 1.可变模版参数1.1 基本语法及其原理1.2 包扩展1.3 empalce系列接口1.3.1 push_back和emplace_back1.3.2 emplace_back在list中的使用&#xff08;模拟实现&#xff09; 2. lambda2.1 lambda表达式语法 1.可变模版参数 1.1 基本语法及其原理 1. C11支持可变参数模版&…...

网站打开提示不安全

当网站打开时显示“不安全”提示&#xff08;通常表现为浏览器地址栏中出现“不安全”字样或红色警告图标&#xff09;&#xff0c;这意味着网站未使用有效的SSL证书或HTTPS协议&#xff0c;导致浏览器认为连接不安全。以下是解决这一问题的详细步骤&#xff1a; 一. 原因分析 …...

OpenCV:特征检测总结

目录 一、什么是特征检测&#xff1f; 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT&#xff08;尺度不变特征变换&#xff09; 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…...

标志的推理

下面的讨论是我对《对编程实现拟人智能可行性的论证》这篇文章的“赋值与对象的标志”这一节的展开讨论。 标志能够使我们更好的思维&#xff08;比如用轮廓标记物体对象&#xff0c;用兴奋强度标记回忆情况等等&#xff09;。有思维标志、信息标志&#xff0c;单纯标志、组合…...

python学opencv|读取图像(五十七)使用cv2.bilateralFilter()函数实现图像像素双边滤波处理

【1】引言 前序学习过程中&#xff0c;已经掌握了对图像的基本滤波操作技巧&#xff0c;具体的图像滤波方式包括均值滤波、中值滤波和高斯滤波&#xff0c;相关文章链接有&#xff1a; python学opencv|读取图像&#xff08;五十四&#xff09;使用cv2.blur()函数实现图像像素…...

【SQL技术】不同数据库引擎 SQL 优化方案剖析

一、引言 在数据处理和分析的世界里&#xff0c;SQL 是不可或缺的工具。不同的数据库系统&#xff0c;如 MySQL、PostgreSQL&#xff08;PG&#xff09;、Doris 和 Hive&#xff0c;在架构和性能特点上存在差异&#xff0c;因此针对它们的 SQL 优化策略也各有不同。这些数据库中…...

链式结构二叉树(递归暴力美学)

文章目录 1. 链式结构二叉树1.1 二叉树创建 2. 前中后序遍历2.1 遍历规则2.2 代码实现图文理解 3. 结点个数以及高度等二叉树结点个数正确做法&#xff1a; 4. 层序遍历5. 判断是否完全二叉树 1. 链式结构二叉树 完成了顺序结构二叉树的代码实现&#xff0c;可以知道其底层结构…...

使用类别数据编码进行连续变量的特征提取

在数据科学和机器学习中,数据预处理是模型构建的重要步骤。对于处理结构化数据时,特别是包含类别型数据的场景,类别数据编码是必不可少的步骤。类别数据通常以文字、标签等形式出现,但大多数机器学习算法只能处理数值型数据,因此需要将类别数据转化为数值格式。编码方式的…...

PCL 最小包围圆(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 最小包围圆是指能够包含给定点集中所有点的最小圆。这个算法通常用于计算几何、计算机图形学、机器学习等领域。以下是该算法的基本原理和实现流程: 1. 初始化:将点集中的所有点加入待处理列表。 2. 查找最远点:…...

技术文档管理最佳实践:高效、专业、可持续

文章目录 技术文档管理最佳实践&#xff1a;高效、专业、可持续1. 技术文档的核心价值1.1 降低知识流失风险1.2 提升开发效率1.3 增强团队协作1.4 规范技术资产管理 2. 技术文档分类与规范2.1 代码相关文档2.2 过程与运维文档2.3 知识与培训文档 3. 工具选型&#xff1a;自动化…...

56. Uboot移植实验

一、NXP官方Uboot编译与测试 1、将NXP提供的uboot拷贝到ubuntu中。 一个开发板也好运行uboot&#xff0c;DDR或者叫DRAM&#xff0c;串口&#xff0c;SD、EMMC、NAND。板子能工作。 测似结果&#xff1a; 1、uboot能正常启动 2、LCD驱动要根据所使用的屏幕修改。 3、NET初始…...

AI大模型:本地部署deepseek

一、安装lmstudio 1、下载网站&#xff1a; LM Studio - Discover, download, and run local LLMs 2、直接安装即可&#xff0c;记住安装的路径 二、下载deepseek模型 2.1、下载的流程 1、下载网站 https://huggingface.co/models 2、在搜索框输入&#xff1a;deepseek …...

(算法竞赛)图论+DFS深搜——图的dfs遍历1

题目描述 给定一个无向图&#xff0c;包含 n 个顶点&#xff08;编号为 1 到 n&#xff09;和 e 条边。要求从顶点 1 开始进行深度优先搜索&#xff08;DFS&#xff09;&#xff0c;并按照访问顺序输出遍历结果。注意&#xff1a;当存在多个邻接点时&#xff0c;优先访问编号较…...

RK3588平台开发系列讲解(DMA篇)DMA engine使用

文章目录 一、DMA 使用步骤二、DMA接口2.1、DMA 通道管理相关接口2.2、DMA 描述符相关接口2.3、DMA 启动与控制接口2.4、DMA 状态检查接口2.5、 DMA 缓存管理接口2.6、DMA 中断与同步机制沉淀、分享、成长,让自己和他人都能有所收获!😄 Linux 内核的 DMA 引擎提供了一组完整…...

报名 | IEEE ICME 2025 音频编码器能力挑战赛正式开启

音频编码器是多模态大模型的重要组件&#xff0c;优秀的音频编码器在构建多模态系统中至关重要。在此背景下&#xff0c;小米集团、萨里大学、海天瑞声共同主办了 IEEE International Conference on Multimedia & Expo (ICME) 2025 Audio Encoder Capability Challenge。 …...

fputs的概念和使用案例

fputs 是 C 语言中用于向文件写入字符串的标准库函数。它与 puts 类似&#xff0c;但不会自动添加换行符&#xff0c;且支持向任意文件流&#xff08;如磁盘文件、标准输出等&#xff09;写入数据。 概念解析 函数原型&#xff1a;int fputs(const char *str, FILE *stream); …...

ASP.NET Core标识框架Identity

目录 Authentication与Authorization 标识框架&#xff08;Identity&#xff09; Identity框架的使用 初始化 自定义属性 案例一&#xff1a;添加用户、角色 案例二&#xff1a;检查登录用户信息 案例三&#xff1a;实现密码的重置 步骤 Authentication与Authorizatio…...

PFAS(全氟烷基和多氟烷基物质)测试流程详细介绍

PFAS&#xff08;全氟烷基和多氟烷基物质&#xff09;测试详细介绍 什么是PFAS&#xff1f; PFAS是(Per-and polyfluoroalkyl substances)的简称&#xff0c;中文名&#xff1a;全氟烷基和多氟烷基物质&#xff0c;是一系列合成有机氟化物的总称&#xff0c;是指至少含有一个…...

宝塔面板端口转发其它端口至MySQL的3306

最近需要把服务器的MySQL服务开放给外网&#xff0c;但又希望公开给所有人。也不想用默认的3306端口。同时也不想改变MySQL的默认端口。 这时候最好的办法就是用一个不常用的端口来转发至3306上去。例如使用49306至3306&#xff0c;外网通过49306来访问&#xff0c;内网依然使用…...

inquirer介绍及配合lerna在Vue中使用示例

目录 安装基本用法使用多个提示框动态选择&#xff08;动态选项&#xff09;表单式输入配合lerna在Vue中使用示例 Inquirer 是一个用于创建交互式命令行工具的 Node.js 库&#xff0c;常用于收集用户输入。它提供了多种类型的提示框&#xff0c;可以用于创建交互式应用程序&…...

AI商业化:如何包装技术并找到客户需求?

AI商业化:如何包装技术并找到客户需求? 适用人群:对人工智能技术有一定沉淀,正在探索技术变现和商业模式创新的创业者、技术团队以及企业管理者。同时也适合对 AI 产品包装、市场调研与用户调研感兴趣的从业人员。 一、引言 在过去几年里,从 GPT、Transformer 到 DeepSee…...

基于MODIS/Landsat/Sentinel/国产卫星遥感数据与DSSAT作物模型同化的作物产量估算

基于过程的作物生长模拟模型DSSAT是现代农业系统研究的有力工具&#xff0c;可以定量描述作物生长发育和产量形成过程及其与气候因子、土壤环境、品种类型和技术措施之间的关系&#xff0c;为不同条件下作物生长发育及产量预测、栽培管理、环境评价以及未来气候变化评估等提供了…...