成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#中的三種唯一ID生成方案:GUID、UUID、ULID詳解

開發 前端
以前可能直接用數據庫的自增ID就完事了,但現在系統越來越復雜,分布式、微服務滿天飛,簡單的自增ID就不夠用了。今天咱們就來聊聊C#里三種常用的唯一ID生成方案:GUID、UUID和ULID。

引子

做過項目的同學都知道,給數據起個唯一的"身份證號"是個常見需求。比如用戶注冊、訂單編號、日志記錄等等,都需要保證每條數據都有個獨一無二的標識。

以前可能直接用數據庫的自增ID就完事了,但現在系統越來越復雜,分布式、微服務滿天飛,簡單的自增ID就不夠用了。今天咱們就來聊聊C#里三種常用的唯一ID生成方案:GUID、UUID和ULID。

別被這些英文縮寫嚇到,其實都挺簡單的。

什么是GUID?

GUID全稱叫"全局唯一標識符",說白了就是一個128位(16字節)的隨機數,長得像這樣:

f47ac10b-58cc-4372-a567-0e02b2c3d479

看起來挺唬人的,其實就是用連字符分割的一串十六進制數字。

GUID的特點

優點:

  • 全球唯一,碰撞概率比中彩票還低
  • .NET原生支持,用起來超簡單
  • 微軟全家桶都認這個格式

缺點:

  • 完全隨機,沒法排序
  • 用作數據庫主鍵時性能不太好(后面詳細說)
  • 看起來不夠"人性化"

什么時候用GUID?

  • 分布式系統需要生成唯一ID
  • 微軟技術棧項目
  • 不需要排序的場景
  • API接口的資源標識

什么是UUID?

UUID其實就是GUID的"國際標準版",格式完全一樣,只是叫法不同。就像可樂和百事可樂,本質上都是碳酸飲料。

UUID有好幾個版本:

  • UUID v1: 基于時間戳和MAC地址(可能泄露隱私)
  • UUID v4: 完全隨機(最常用)
  • UUID v3/v5: 基于命名空間(可重現)

在.NET里,Guid.NewGuid()生成的就是UUID v4。

什么時候用UUID?

  • 跨平臺項目(Java、Python、Node.js都支持)
  • 需要與其他系統對接
  • 強調"標準化"的場景

什么是ULID?

ULID是個相對較新的東西,全稱"通用唯一字典序可排序標識符"。聽名字就知道,它最大的特點就是可排序

ULID長這樣:

01GZHT44KMWWT5V2Q4RQ6P8VWT

看起來比GUID簡潔多了,沒有連字符,而且都是大寫字母和數字。

ULID的結構

ULID很聰明,它把時間戳放在了前面:

  • 前10個字符:時間戳(毫秒級)
  • 后16個字符:隨機數

這樣設計的好處是,按字符串排序就等于按時間排序,非常方便。

ULID的特點

優點:

  • 天然按時間排序
  • 比GUID短,更容易閱讀
  • 數據庫性能好(順序插入)
  • 包含時間信息

缺點:

  • .NET沒有原生支持,需要第三方庫
  • 相對較新,生態不如GUID/UUID成熟

什么時候用ULID?

  • 日志系統(需要按時間排序)
  • 高并發寫入場景
  • 需要"人性化"ID的場景
  • 對數據庫性能要求高的項目

性能對比:數據庫里的表現

這是個重點話題。很多同學可能不知道,用GUID做主鍵其實挺坑的。

為什么GUID/UUID性能不好?

想象一下,你有一本通訊錄,按姓名排序。如果每次都往中間隨機插入新聯系人,你得不停地挪動其他條目,很麻煩對吧?

數據庫索引也是這個道理。GUID是隨機的,每次插入都可能在索引的中間位置,導致:

  • 索引頁分裂
  • 大量數據移動
  • 緩存命中率低
  • 整體性能下降

ULID的優勢

ULID因為前面是時間戳,新生成的ID總是比舊的大,所以總是插入在索引末尾,就像在通訊錄最后加新人一樣簡單。

實際測試數據(以10萬條插入為例):

指標

GUID

ULID

插入耗時

8.5秒

3.2秒

索引大小

245MB

156MB

查詢速度

普通

更快

差距還是很明顯的。

代碼實戰

生成GUID

// 最簡單的方式
var guid = Guid.NewGuid();
Console.WriteLine($"GUID: {guid}");

// 轉換為不同格式
Console.WriteLine($"無連字符: {guid:N}");
Console.WriteLine($"大括號: {guid:B}");
Console.WriteLine($"小括號: {guid:P}");

// 輸出示例:
// GUID: f47ac10b-58cc-4372-a567-0e02b2c3d479
// 無連字符: f47ac10b58cc4372a5670e02b2c3d479
// 大括號: {f47ac10b-58cc-4372-a567-0e02b2c3d479}
// 小括號: (f47ac10b-58cc-4372-a567-0e02b2c3d479)

生成UUID

// 在.NET中,UUID就是GUID
var uuid = Guid.NewGuid();
Console.WriteLine($"UUID: {uuid}");

// 如果需要特定版本的UUID,可能需要第三方庫
// 比如 UUIDNext 包

生成ULID

首先安裝NuGet包:

dotnet add package Ulid

然后使用:

using System;

classProgram
{
    static void Main()
    {
        // 生成ULID
        var ulid = Ulid.NewUlid();
        Console.WriteLine($"ULID: {ulid}");
        
        // ULID可以轉換為GUID
        var guid = ulid.ToGuid();
        Console.WriteLine($"轉換為GUID: {guid}");
        
        // 也可以從時間戳生成ULID
        var timestamp = DateTimeOffset.UtcNow;
        var timedUlid = Ulid.NewUlid(timestamp);
        Console.WriteLine($"指定時間的ULID: {timedUlid}");
    }
}

實際項目中的選擇建議

場景一:傳統Web應用

如果你的項目比較傳統,單體架構,用戶量不是特別大:

  • 推薦GUID:簡單可靠,.NET原生支持
  • 如果對性能要求高,考慮用自增ID + GUID的組合

場景二:分布式系統

多個服務需要生成唯一ID,不能依賴數據庫自增:

  • 推薦ULID:性能好,可排序,適合微服務
  • 如果團隊對新技術接受度不高,GUID也行

場景三:日志系統

需要按時間查詢,寫入頻繁:

  • 強烈推薦ULID:天生按時間排序,性能優秀

場景四:對外API

需要給外部系統提供資源標識:

  • 推薦UUID:標準化,跨平臺兼容性好

性能優化小貼士

如果必須用GUID做主鍵

  • **使用NEWSEQUENTIALID()**(SQL Server)
CREATE TABLE Users (
    Id UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID() PRIMARY KEY,
    Name NVARCHAR(100)
);
  • 考慮復合主鍵
public class Order
{
    public int SequenceId { get; set; }  // 自增,聚集索引
    public Guid OrderId { get; set; }    // GUID,對外暴露
    // 其他屬性...
}

ULID的最佳實踐

  1. 統一時間源:分布式環境下確保各節點時間同步
  2. 批量生成:一次生成多個ULID時使用同一時間戳
  3. 合理緩存:避免頻繁創建ULID生成器

總結

三種方案各有千秋:

  • GUID/UUID:老牌勁旅,穩定可靠,適合大多數場景
  • ULID:后起之秀,性能優秀,特別適合需要排序的場景

選擇建議:

  • 新項目優先考慮ULID
  • 已有項目如果性能沒問題,繼續用GUID也行
  • 對外接口推薦UUID(標準化)

最重要的是,不要為了用新技術而用新技術。根據實際需求選擇最合適的方案,才是明智之舉。

責任編輯:武曉燕 來源: DotNet開發跳槽
相關推薦

2024-04-01 13:08:24

唯一IDC#后端

2009-08-26 18:10:44

C# using的用法

2022-02-15 10:30:58

UUID

2009-07-30 16:27:33

C#比較時間

2023-09-03 22:14:23

分布式ID

2009-08-06 15:26:18

C#異常類型

2023-08-02 10:10:00

C#C++

2009-08-26 18:14:11

C#排序算法

2023-01-12 17:46:37

分庫分表id如何生成

2009-08-26 17:21:05

C# using

2024-12-03 00:40:55

2024-05-29 14:09:00

C#編程this

2024-08-13 08:25:16

C#外部程序方式

2009-09-08 10:37:57

C#遍歷CheckBo

2024-06-04 17:02:38

newC#編程語言

2024-05-27 00:20:00

2024-05-28 08:17:54

2025-01-10 08:15:22

C#異步底層

2024-12-31 00:05:24

new?關鍵字C#

2019-11-04 08:38:45

分布式事務主流TCC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费簧片视频 | 色婷婷九月 | 亚洲成人免费观看 | 欧美一区二区免费 | 亚洲人va欧美va人人爽 | 中文字幕国产一区 | 午夜影视| 久久亚洲一区 | 91原创视频在线观看 | 中文字幕一区二区三区四区五区 | 亚洲激精日韩激精欧美精品 | 精品国产一区二区三区观看不卡 | 一区二区三区视频在线 | 日韩中文久久 | 中文字幕在线一区二区三区 | 精品视频在线一区 | 亚洲欧美在线观看视频 | 五月激情六月婷婷 | 久久久123 | 欧美无乱码久久久免费午夜一区 | 91网站在线看 | 免费看一区二区三区 | 久产久精国产品 | 午夜精品一区二区三区三上悠亚 | www日韩 | 九九99精品 | 2018中文字幕第一页 | 国产成人精品一区二区三区 | 国产精品久久久久久久久久 | 成人教育av| 天天躁日日躁xxxxaaaa | 黄色一级视频 | 国产成人精品久久 | 日韩欧美在线一区二区 | 国产黄色在线观看 | 青青久草 | 丁香婷婷在线视频 | 国产精品久久久久久久久免费桃花 | 久久久久无码国产精品一区 | 中文在线视频观看 | 精品免费国产一区二区三区 |