首頁>技術>

在程式開發中經常會用到 GUID (全球唯一標誌符) 的場景,GUID 就像資料庫中的主鍵,它能夠確保一些非常重要的資訊,比如說:客戶資料或發票不會出現重複或者資料被覆蓋,如果沒有GUID的話,你很難保證資料不丟失以及資料的完整性。

要想執行本篇提供的例子,你需要安裝 Visual Studio 2019,如果沒有的話,可以到官網去下載。

為什麼要用 GUID

想象一下如果你有一個銷售性質的app手機程式,它可以工作於離線和線上兩種模式,假定你的程式所生成的訂單ID是從1開始遞增的,當你的應用程式在離線狀態下生成了一些銷售訂單資料,一旦聯網之後,這些重複的訂單ID如何進行合併,不用想肯定會存在衝突的,對吧,所以你要做的事情就是完全做到訂單ID的唯一性,而不是為了這個情況不得不寫很多的程式碼來妥協。

接下來看一下 GUID 是如何解決這種問題的,GUID 是一個很長的編號,有128bit位,幾乎可以說是獨一無二的,這裡我為什麼要加上幾乎呢? 雖然GUID是一個很長的編號,它的衝突微乎其微,但不代表這種可能性為 0 。

你可以把 GUID 作為你資料表的主鍵,這樣你也不用怕當有多個 資料庫 做合併的時候產生主鍵衝突,因為根本就不會發生,而且在 離線狀態 下,你也可以大大方方的使用 GUID 來生成銷售訂單,不需要去連線什麼內網和外網。

GUID 的組成分析

下面就是一個 GUID 的例子,值得注意的是 GUID 通常是128bit,為了方便閱讀一般都用 16進製表示。

eaa24756-3fac-4e46-b4bb-074ff4f5b846

GUID 是一個約定為 32 個16進位制組成的,這些16進位制數字由 8-4-4-12 分四塊進行編碼的,大家可以仔細對照上面的GUID格式,因此最多有 2^128 個 GUID。

使用 C#8 生成GUID

這一部分將會學習如何使用 C# 建立 GUID,你可以使用 System 名稱空間下的結構體 Guid,這是生成 Guid 最直接的一個方式,可以像下面程式碼那樣在 Main 方法中生成GUID。

Guid obj = Guid.NewGuid();Console.WriteLine("The newly created Guid is: " + obj.ToString());Console.ReadKey();
使用 C#8 生成一個空的 GUID

因為GUID是一個結構體,所以它肯定是一個值型別,但是值型別你不可以給它設定為null,意思就是,如果你想生成一個空GUID,你可以如下這麼寫:

Guid id = new Guid();if(id == Guid.Empty)Console.WriteLine("The Guid is empty");

空的GUID的值是:00000000-0000-0000-0000-000000000000,你可以利用這個值去判斷另一個GUID 是否為空,對吧,程式碼如下:

if (guid != Guid.Empty){    //The GUID object contains non-zero values}else{  //The GUID object is empty} 

下面我寫了一個簡單的擴充套件方法,用於判斷指定的 GUID 是否為空。

public static bool IsNullOrEmpty(this Guid guid){  return (guid == Guid.Empty);} 

如果你想判斷一個可空型別的GUID是否為null,可以用下面的擴充套件方法。

public static bool IsNullOrEmpty(this Guid? guid){  if (guid.HasValue)    if (guid == default(Guid))        return true;    return false;}

值得注意的是,default(Guid) 和 Guid.Empty 兩者是等價的。

C#8 中如何將 GUID 轉為 string

你甚至可以將 GUID 轉成一個 string 值,下面的程式碼片段展示瞭如何將一個 空GUID 轉成 string 的過程。

string str = Guid.Empty.ToString();Console.WriteLine(str);

在使用GUID 的過程中有一點要注意,你除了會遇到極小機率的衝突,更要注意的是GUID 會佔用更多的儲存空間和它的生成無序性,其實你也可以變通實現,比如使用兩個 Ulong 總共128bit 並且有序的遞增它實現一個程式設計性質的唯一GUID。

如果你想把 GUID 繫結到你的資料控制元件或者使用者介面,你可以將 GUID 轉成 String形式,甚至可以將 GUID 按照你的想要的格式進行 ToString。

你也可以透過其他的方式生成一個 GUID,比如說:隨機數,基於時間,基於硬體,基於內容(比如:MD5,SHA-1),在後面的文章中我會帶著大家用這些方法是去實現以及更多GUID的高階功能。

21
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • synchronized用法原理和鎖最佳化升級過程(面試)