前言
c# 中的 guid 类(全局唯一标识符,globally unique identifier)用于生成和操作 128 位的唯一标识符。它在需要唯一标识的场景(如数据库主键、分布式系统等)中广泛使用。
一、什么是 guid
guid(globally unique identifier,全局唯一标识符)是一种由 128 位(16 字节)组成的唯一标识符。
- 它通常以 32 个十六进制数字表示,分为 5 组,格式为 8-4-4-4-12:
xxxxxxxx-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")); // 输出类似: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 时,通常将其转换为字符串格式,以方便传输和解析。
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使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论