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

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

開發(fā) 前端
以前可能直接用數(shù)據(jù)庫(kù)的自增ID就完事了,但現(xiàn)在系統(tǒng)越來(lái)越復(fù)雜,分布式、微服務(wù)滿天飛,簡(jiǎn)單的自增ID就不夠用了。今天咱們就來(lái)聊聊C#里三種常用的唯一ID生成方案:GUID、UUID和ULID。

引子

做過(guò)項(xiàng)目的同學(xué)都知道,給數(shù)據(jù)起個(gè)唯一的"身份證號(hào)"是個(gè)常見需求。比如用戶注冊(cè)、訂單編號(hào)、日志記錄等等,都需要保證每條數(shù)據(jù)都有個(gè)獨(dú)一無(wú)二的標(biāo)識(shí)。

以前可能直接用數(shù)據(jù)庫(kù)的自增ID就完事了,但現(xiàn)在系統(tǒng)越來(lái)越復(fù)雜,分布式、微服務(wù)滿天飛,簡(jiǎn)單的自增ID就不夠用了。今天咱們就來(lái)聊聊C#里三種常用的唯一ID生成方案:GUID、UUID和ULID。

別被這些英文縮寫嚇到,其實(shí)都挺簡(jiǎn)單的。

什么是GUID?

GUID全稱叫"全局唯一標(biāo)識(shí)符",說(shuō)白了就是一個(gè)128位(16字節(jié))的隨機(jī)數(shù),長(zhǎng)得像這樣:

f47ac10b-58cc-4372-a567-0e02b2c3d479

看起來(lái)挺唬人的,其實(shí)就是用連字符分割的一串十六進(jìn)制數(shù)字。

GUID的特點(diǎn)

優(yōu)點(diǎn):

  • 全球唯一,碰撞概率比中彩票還低
  • .NET原生支持,用起來(lái)超簡(jiǎn)單
  • 微軟全家桶都認(rèn)這個(gè)格式

缺點(diǎn):

  • 完全隨機(jī),沒法排序
  • 用作數(shù)據(jù)庫(kù)主鍵時(shí)性能不太好(后面詳細(xì)說(shuō))
  • 看起來(lái)不夠"人性化"

什么時(shí)候用GUID?

  • 分布式系統(tǒng)需要生成唯一ID
  • 微軟技術(shù)棧項(xiàng)目
  • 不需要排序的場(chǎng)景
  • API接口的資源標(biāo)識(shí)

什么是UUID?

UUID其實(shí)就是GUID的"國(guó)際標(biāo)準(zhǔn)版",格式完全一樣,只是叫法不同。就像可樂(lè)和百事可樂(lè),本質(zhì)上都是碳酸飲料。

UUID有好幾個(gè)版本:

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

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

什么時(shí)候用UUID?

  • 跨平臺(tái)項(xiàng)目(Java、Python、Node.js都支持)
  • 需要與其他系統(tǒng)對(duì)接
  • 強(qiáng)調(diào)"標(biāo)準(zhǔn)化"的場(chǎng)景

什么是ULID?

ULID是個(gè)相對(duì)較新的東西,全稱"通用唯一字典序可排序標(biāo)識(shí)符"。聽名字就知道,它最大的特點(diǎn)就是可排序

ULID長(zhǎng)這樣:

01GZHT44KMWWT5V2Q4RQ6P8VWT

看起來(lái)比GUID簡(jiǎn)潔多了,沒有連字符,而且都是大寫字母和數(shù)字。

ULID的結(jié)構(gòu)

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

  • 前10個(gè)字符:時(shí)間戳(毫秒級(jí))
  • 后16個(gè)字符:隨機(jī)數(shù)

這樣設(shè)計(jì)的好處是,按字符串排序就等于按時(shí)間排序,非常方便。

ULID的特點(diǎn)

優(yōu)點(diǎn):

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

缺點(diǎn):

  • .NET沒有原生支持,需要第三方庫(kù)
  • 相對(duì)較新,生態(tài)不如GUID/UUID成熟

什么時(shí)候用ULID?

  • 日志系統(tǒng)(需要按時(shí)間排序)
  • 高并發(fā)寫入場(chǎng)景
  • 需要"人性化"ID的場(chǎng)景
  • 對(duì)數(shù)據(jù)庫(kù)性能要求高的項(xiàng)目

性能對(duì)比:數(shù)據(jù)庫(kù)里的表現(xiàn)

這是個(gè)重點(diǎn)話題。很多同學(xué)可能不知道,用GUID做主鍵其實(shí)挺坑的。

為什么GUID/UUID性能不好?

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

數(shù)據(jù)庫(kù)索引也是這個(gè)道理。GUID是隨機(jī)的,每次插入都可能在索引的中間位置,導(dǎo)致:

  • 索引頁(yè)分裂
  • 大量數(shù)據(jù)移動(dòng)
  • 緩存命中率低
  • 整體性能下降

ULID的優(yōu)勢(shì)

ULID因?yàn)榍懊媸菚r(shí)間戳,新生成的ID總是比舊的大,所以總是插入在索引末尾,就像在通訊錄最后加新人一樣簡(jiǎn)單。

實(shí)際測(cè)試數(shù)據(jù)(以10萬(wàn)條插入為例):

指標(biāo)

GUID

ULID

插入耗時(shí)

8.5秒

3.2秒

索引大小

245MB

156MB

查詢速度

普通

更快

差距還是很明顯的。

代碼實(shí)戰(zhàn)

生成GUID

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

// 轉(zhuǎn)換為不同格式
Console.WriteLine($"無(wú)連字符: {guid:N}");
Console.WriteLine($"大括號(hào): {guid:B}");
Console.WriteLine($"小括號(hào): {guid:P}");

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

生成UUID

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

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

生成ULID

首先安裝NuGet包:

dotnet add package Ulid

然后使用:

using System;

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

實(shí)際項(xiàng)目中的選擇建議

場(chǎng)景一:傳統(tǒng)Web應(yīng)用

如果你的項(xiàng)目比較傳統(tǒng),單體架構(gòu),用戶量不是特別大:

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

場(chǎng)景二:分布式系統(tǒng)

多個(gè)服務(wù)需要生成唯一ID,不能依賴數(shù)據(jù)庫(kù)自增:

  • 推薦ULID:性能好,可排序,適合微服務(wù)
  • 如果團(tuán)隊(duì)對(duì)新技術(shù)接受度不高,GUID也行

場(chǎng)景三:日志系統(tǒng)

需要按時(shí)間查詢,寫入頻繁:

  • 強(qiáng)烈推薦ULID:天生按時(shí)間排序,性能優(yōu)秀

場(chǎng)景四:對(duì)外API

需要給外部系統(tǒng)提供資源標(biāo)識(shí):

  • 推薦UUID:標(biāo)準(zhǔn)化,跨平臺(tái)兼容性好

性能優(yōu)化小貼士

如果必須用GUID做主鍵

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

ULID的最佳實(shí)踐

  1. 統(tǒng)一時(shí)間源:分布式環(huán)境下確保各節(jié)點(diǎn)時(shí)間同步
  2. 批量生成:一次生成多個(gè)ULID時(shí)使用同一時(shí)間戳
  3. 合理緩存:避免頻繁創(chuàng)建ULID生成器

總結(jié)

三種方案各有千秋:

  • GUID/UUID:老牌勁旅,穩(wěn)定可靠,適合大多數(shù)場(chǎng)景
  • ULID:后起之秀,性能優(yōu)秀,特別適合需要排序的場(chǎng)景

選擇建議:

  • 新項(xiàng)目?jī)?yōu)先考慮ULID
  • 已有項(xiàng)目如果性能沒問(wèn)題,繼續(xù)用GUID也行
  • 對(duì)外接口推薦UUID(標(biāo)準(zhǔn)化)

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

責(zé)任編輯:武曉燕 來(lái)源: DotNet開發(fā)跳槽
相關(guān)推薦

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#比較時(shí)間

2023-09-03 22:14:23

分布式ID

2023-08-02 10:10:00

C#C++

2009-08-06 15:26:18

C#異常類型

2009-08-26 18:14:11

C#排序算法

2023-01-12 17:46:37

分庫(kù)分表id如何生成

2009-08-26 17:21:05

C# using

2024-05-29 14:09:00

C#編程this

2024-12-03 00:40:55

2024-08-13 08:25:16

C#外部程序方式

2009-09-08 10:37:57

C#遍歷CheckBo

2024-06-04 17:02:38

newC#編程語(yǔ)言

2024-05-27 00:20:00

2025-01-10 08:15:22

C#異步底層

2024-05-28 08:17:54

2024-12-31 00:05:24

new?關(guān)鍵字C#

2019-11-04 08:38:45

分布式事務(wù)主流TCC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕乱码亚洲精品一区 | 日韩精品一区二区三区在线播放 | 国产精品一区一区 | 9191av| 黄色免费网站在线看 | 国产区视频在线观看 | 九九热在线视频 | 日韩av中文 | 色综合99 | 1级黄色大片 | 日韩欧美一区二区三区免费观看 | 99这里只有精品视频 | 日韩在线欧美 | 国产精品久久国产精品99 gif | 亚洲精品女人久久久 | 国产美女一区二区 | 免费a大片 | 精品日韩一区 | aaa一区| www.99热这里只有精品 | 福利视频一区二区 | av乱码| 久久精品一区二区三区四区 | 日韩三级视频 | www.免费看片.com | h片免费在线观看 | 精久久久久 | 国产精品久久777777 | 一区二区视频 | 精品国产一区二区三区久久久久久 | 欧美亚洲国产一区二区三区 | av天天看 | 男女精品网站 | 精品视频免费 | 成人在线免费电影 | 久久在线视频 | 欧美一区二区三区一在线观看 | 久久国产成人 | 亚洲精品乱码久久久久v最新版 | 久久久久久99 | 亚洲天堂二区 |