C#中Guid類使用小結(jié)
前言
C# 中的 Guid 類(全局唯一標(biāo)識符,Globally Unique Identifier)用于生成和操作 128 位的唯一標(biāo)識符。它在需要唯一標(biāo)識的場景(如數(shù)據(jù)庫主鍵、分布式系統(tǒng)等)中廣泛使用。
一、什么是 Guid
Guid(Globally Unique Identifier,全局唯一標(biāo)識符)是一種由 128 位(16 字節(jié))組成的唯一標(biāo)識符。
- 它通常以 32 個(gè)十六進(jìn)制數(shù)字表示,分為 5 組,格式為 8-4-4-4-12:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
。 - 示例:
123e4567-e89b-12d3-a456-426614174000
。
Guid 的主要用途是為對象、數(shù)據(jù)庫記錄等提供一個(gè)在全局范圍內(nèi)唯一的標(biāo)識,避免因重復(fù)而導(dǎo)致的沖突問題。
二、生成 Guid
在 C# 中,可以使用 System.Guid 類來生成 Guid。
1. 使用 Guid.NewGuid() 方法
這是最常用的方式,用于生成一個(gè)新的隨機(jī) Guid。
Guid newGuid = Guid.NewGuid(); Console.WriteLine(newGuid.ToString());
每次調(diào)用 Guid.NewGuid() 方法都會生成一個(gè)不同的 Guid,它通過復(fù)雜的算法確保生成的 Guid 在全球范圍內(nèi)具有極高的唯一性。
2. 從字符串創(chuàng)建 Guid
如果已經(jīng)有一個(gè)符合 Guid 格式的字符串,可以通過 Guid.Parse 或 Guid.TryParse 方法將其轉(zhuǎn)換為 Guid 對象。
string guidString = "123e4567-e89b-12d3-a456-426614174000"; Guid guid = Guid.Parse(guidString); Console.WriteLine(guid.ToString());
Guid.Parse 方法在字符串格式不正確時(shí)會拋出異常,而 Guid.TryParse 方法則會返回一個(gè)布爾值,表示轉(zhuǎn)換是否成功,避免異常的發(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. 從構(gòu)造函數(shù)
- 全零 Guid:Guid.Empty 表示全零的 Guid(00000000-0000-0000-0000-000000000000)。
- 從字節(jié)數(shù)組創(chuàng)建 Guid
- 如果有一個(gè)長度為 16 的字節(jié)數(shù)組,也可以通過 new Guid(byte[]) 構(gòu)造函數(shù)來創(chuàng)建 Guid。
byte[] bytes = new byte[16]; // 使用隨機(jī)數(shù)填充字節(jié)數(shù)組 Random random = new Random(); random.NextBytes(bytes); Guid guid = new Guid(bytes); Console.WriteLine(guid.ToString());
實(shí)例化
- 使用指定字符串表示的值創(chuàng)建Guid結(jié)構(gòu)。
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 提供了多種格式化選項(xiàng),可以通過 ToString 方法并指定格式化字符串來控制輸出格式。
- “N”:不帶連字符的32個(gè)數(shù)字組成的字符串。
- “D”:由連字符分隔的32個(gè)數(shù)字(默認(rèn)格式)。
- “B”:被大括號包圍的GUID。
- “P”:被圓括號包圍的GUID。
- “X”:每個(gè)字節(jié)由“0x”開頭的十六進(jìn)制字符串組成,整個(gè)GUID被大括號包圍,并且每兩個(gè)字節(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 類提供了多種比較方法,用于比較兩個(gè) Guid 是否相等。
- 使用 Equals 方法
Guid guid1 = Guid.NewGuid(); Guid guid2 = guid1; bool isEqual = guid1.Equals(guid2); Console.WriteLine(isEqual); // 輸出:True
- 使用 == 和 != 運(yùn)算符
bool isEqual = guid1 == guid2; bool isNotEqual = guid1 != guid2; Console.WriteLine(isEqual); // 輸出:True Console.WriteLine(isNotEqual); // 輸出:False
- 使用 CompareTo 方法
CompareTo 方法用于比較兩個(gè) 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 位的結(jié)構(gòu),因此在存儲和傳輸時(shí)需要考慮其大小和性能。
1. 數(shù)據(jù)庫存儲
在數(shù)據(jù)庫中,Guid 通常以 uniqueidentifier 類型存儲(在 SQL Server 中)。在實(shí)體框架(Entity Framework)中,可以將實(shí)體的主鍵設(shè)置為 Guid 類型。
public class MyEntity { public Guid Id { get; set; } // 其他屬性 }
2. 網(wǎng)絡(luò)傳輸
在通過網(wǎng)絡(luò)傳輸 Guid 時(shí),通常將其轉(zhuǎn)換為字符串格式,以方便傳輸和解析。
string guidString = guid.ToString(); // 傳輸 guidString
在接收端,可以使用 Guid.Parse 或 Guid.TryParse 方法將其轉(zhuǎn)換回 Guid 對象。
五、使用場景與注意事項(xiàng)
1. 使用場景
- 數(shù)據(jù)庫主鍵
- GUID常被用作數(shù)據(jù)庫表的主鍵,尤其是在分布式系統(tǒng)中。由于其獨(dú)特性,它可以確保跨多個(gè)數(shù)據(jù)庫或服務(wù)的數(shù)據(jù)同步問題最小化。替代自增整數(shù),避免主鍵暴露業(yè)務(wù)信息。
- 唯一標(biāo)識
- GUID非常適合用于需要保證唯一性的場合,例如用戶會話ID、訂單編號等。
- 文件名
- 在某些情況下,GUID可以用作文件名的一部分,以確保文件名稱在全球范圍內(nèi)唯一。
2. 注意事項(xiàng)
- 性能問題:雖然 Guid 的唯一性很高,但生成 Guid 和比較 Guid 的性能相對較低。在需要大量生成和比較 Guid 的場景中,需要考慮性能優(yōu)化。
- 隨機(jī)性與唯一性:
- Guid.NewGuid() 生成的是隨機(jī)的 Guid,其唯一性基于隨機(jī)算法。雖然沖突的概率極低,但在極端情況下仍然可能存在沖突。如果需要更高的唯一性,可以考慮使用其他生成策略,例如基于時(shí)間戳和機(jī)器標(biāo)識的 Guid 生成算法。
- 理論上存在重復(fù)概率,但極低(每秒生成 10 億個(gè) Guid,約需 100 年才會重復(fù))。
- 存儲空間:Guid 占用 16 字節(jié)的空間,相比整數(shù)類型的主鍵(如 int 或 long),存儲空間更大。在存儲大量數(shù)據(jù)時(shí),需要考慮存儲空間的開銷。
- 無序性:Guid 無序,作為主鍵可能導(dǎo)致索引碎片(可考慮順序 Guid,如 CombGuid,結(jié)合時(shí)間戳和隨機(jī)數(shù),優(yōu)化數(shù)據(jù)庫索引性能。)
- 安全性:隨機(jī) Guid 不保證加密安全,需使用 RNGCryptoServiceProvider 生成安全隨機(jī)數(shù)。
七、總結(jié)
Guid 是一種非常有用的唯一標(biāo)識符,在 C# 中可以通過多種方式生成、格式化和比較。它在數(shù)據(jù)庫主鍵、對象標(biāo)識、分布式系統(tǒng)中具有廣泛的應(yīng)用。然而,在使用 Guid 時(shí)也需要考慮其性能和存儲空間的開銷,合理選擇使用場景。
到此這篇關(guān)于C#中Guid類使用小結(jié)的文章就介紹到這了,更多相關(guān)C# Guid使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c# 從內(nèi)存中釋放Selenium chromedriver.exe
這篇文章主要介紹了c# 從內(nèi)存中釋放Selenium chromedriver.exe的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-01-01C#基于WebBrowser獲取cookie的實(shí)現(xiàn)方法
這篇文章主要介紹了C#基于WebBrowser獲取cookie的實(shí)現(xiàn)方法,實(shí)例分析了C#基于WebBrowser簡單讀取瀏覽谷歌網(wǎng)站cookie的相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下2015-11-11C#實(shí)現(xiàn)復(fù)制文件夾中文件到另一個(gè)文件夾的方法
這篇文章主要介紹了C#實(shí)現(xiàn)復(fù)制文件夾中文件到另一個(gè)文件夾的方法,實(shí)例分析了C#實(shí)現(xiàn)文件夾的查找、判斷及文件復(fù)制相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07C#中Task.ContinueWith連續(xù)任務(wù)使用實(shí)例
本文主要介紹了C#中Task.ContinueWith連續(xù)任務(wù)使用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02