GUID (Globally Unique Identifier) 為 128 位元整數 (16 位元組),標準格式 936DA01F-9ABD-4d9d-80C7-02AF85C822A8,極低機率重複,適合分散式系統唯一識別碼。
// 產生新 GUID
Guid g = Guid.NewGuid();
string s = g.ToString(); // "936DA01F-9ABD-4d9d-80C7-02AF85C822A8"
string n = g.ToString("N"); // "936da01f9abd4d9d80c702af85c822a8" (無連字號)
string d = g.ToString("D"); // 預設格式
string b = g.ToString("B"); // "{936DA01F-9ABD-4d9d-80C7-02AF85C822A8}"
string p = g.ToString("P"); // "(936DA01F-9ABD-4d9d-80C7-02AF85C822A8)"
// 解析字串
Guid g2 = Guid.Parse("936DA01F-9ABD-4d9d-80C7-02AF85C822A8");
bool ok = Guid.TryParse(input, out Guid g3);
using System;
namespace DisplayGUID
{
class GuidExample
{
static void Main(string[] args)
{
GenerateGUID();
}
static void GenerateGUID()
{
Console.WriteLine("GUID: " + Guid.NewGuid().ToString());
}
}
}
| 策略 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Client 端 Guid.NewGuid() | 無需往返 DB、離線可用、分散式唯一 | 索引碎片化、儲存空間大 (16 bytes vs 4/8 bytes) | 離線 APP、多主庫同步、合併複寫 |
| SQL Server NEWID() | DB 端產生、預設值 DEFAULT NEWID() | 同樣索引碎片、需往返取回值 | 純 DB 操作、Stored Procedure 內部 |
| SQL Server NEWSEQUENTIALID() | 有序 GUID、大幅減少索引碎片 | 可預測性略高、僅可作 DEFAULT | 高寫入量 OLTP 系統、叢集索引主鍵 |
| COMB GUID (有序前綴 + 隨機後綴) | 兼顧順序與唯一、客戶端可產生 | 需自行實作 | NHibernate/EF Core 內建支援、高效能寫入 |
NEWSEQUENTIALID() 或 COMB GUID。BIGINT IDENTITY,GUID 另建 非叢集唯一索引。ALTER INDEX ... REBUILD 整理碎片。GUID 不可作為安全 Token** (可預測、無簽章)。API Token、密碼重設連結請使用 System.Security.Cryptography.RandomNumberGenerator 產生 256-bit 隨機字串並簽署 (JWT/HMAC)。