C#中Guid類使用小結
前言
C# 中的 Guid 類(全局唯一標識符,Globally Unique Identifier)用于生成和操作 128 位的唯一標識符。它在需要唯一標識的場景(如數據庫主鍵、分布式系統等)中廣泛使用。
一、什么是 Guid
Guid(Globally Unique Identifier,全局唯一標識符)是一種由 128 位(16 字節(jié))組成的唯一標識符。
- 它通常以 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. 從字符串創(chuàng)建 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 方法則會返回一個布爾值,表示轉換是否成功,避免異常的發(fā)生。
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)。
- 從字節(jié)數組創(chuàng)建 Guid
- 如果有一個長度為 16 的字節(jié)數組,也可以通過 new Guid(byte[]) 構造函數來創(chuàng)建 Guid。
byte[] bytes = new byte[16];
// 使用隨機數填充字節(jié)數組
Random random = new Random();
random.NextBytes(bytes);
Guid guid = new Guid(bytes);
Console.WriteLine(guid.ToString());
實例化
- 使用指定字符串表示的值創(chuàng)建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”:每個字節(jié)由“0x”開頭的十六進制字符串組成,整個GUID被大括號包圍,并且每兩個字節(jié)之間有逗號分隔。
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常被用作數據庫表的主鍵,尤其是在分布式系統中。由于其獨特性,它可以確??缍鄠€數據庫或服務的數據同步問題最小化。替代自增整數,避免主鍵暴露業(yè)務信息。
- 唯一標識
- GUID非常適合用于需要保證唯一性的場合,例如用戶會話ID、訂單編號等。
- 文件名
- 在某些情況下,GUID可以用作文件名的一部分,以確保文件名稱在全球范圍內唯一。
2. 注意事項
- 性能問題:雖然 Guid 的唯一性很高,但生成 Guid 和比較 Guid 的性能相對較低。在需要大量生成和比較 Guid 的場景中,需要考慮性能優(yōu)化。
- 隨機性與唯一性:
- Guid.NewGuid() 生成的是隨機的 Guid,其唯一性基于隨機算法。雖然沖突的概率極低,但在極端情況下仍然可能存在沖突。如果需要更高的唯一性,可以考慮使用其他生成策略,例如基于時間戳和機器標識的 Guid 生成算法。
- 理論上存在重復概率,但極低(每秒生成 10 億個 Guid,約需 100 年才會重復)。
- 存儲空間:Guid 占用 16 字節(jié)的空間,相比整數類型的主鍵(如 int 或 long),存儲空間更大。在存儲大量數據時,需要考慮存儲空間的開銷。
- 無序性:Guid 無序,作為主鍵可能導致索引碎片(可考慮順序 Guid,如 CombGuid,結合時間戳和隨機數,優(yōu)化數據庫索引性能。)
- 安全性:隨機 Guid 不保證加密安全,需使用 RNGCryptoServiceProvider 生成安全隨機數。
七、總結
Guid 是一種非常有用的唯一標識符,在 C# 中可以通過多種方式生成、格式化和比較。它在數據庫主鍵、對象標識、分布式系統中具有廣泛的應用。然而,在使用 Guid 時也需要考慮其性能和存儲空間的開銷,合理選擇使用場景。
到此這篇關于C#中Guid類使用小結的文章就介紹到這了,更多相關C# Guid使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

