唯一ID:UUID 介紹與 google/uuid 庫生成 UUID

UUID 即通用唯一識別碼,是一種用于計算機系統中以確保全局唯一性的標識符。其標準定義于 RFC 4122 文檔中。標準形式包含 32 個 16 進制數字,以連字符切割為五組,格式為 8-4-4-4-12,總共 36 個字符。(形如, d169aa7f-4a6e-4ee2-b073-8e46e29c72f3)。UUID 在生成時利用到了空間信息和時間信息的唯一性,幾乎可以排除重復的可能性。并且 UUID 的生成不依賴于中央注冊機構或協調機制。所以很適合在分布式系統中使用。通常被用于數據庫中作為記錄的唯一標識、在分布式系統中唯一標識資源或服務等(例如使用 Kraft 模式啟動 Kafka 時,需要先給 Kafka 分配 UUID)。

變體

目前 UUID 常見的變體有:、變體1(RFC 4122)、變體2(Microsoft)。它們的主要差別在于二進制存儲和傳輸的方式不同,變體1采用大端序作為二進制存儲與傳輸,而變體2采用部分小端序的方式存儲與傳輸。此外,兩種變體代表變體的比特不同,即第 9 字節的高位不同(xxxxxxxx-xxxx-xxxx-Nxxx-xxxxxxxxxxxx 即此處的 N 不同),變體1為8到b,變體2為c16或d16。

其中,最常見的變體為 RFC 4122 定義的變體1。

版本

根據 RFC 4122,UUID 有五種不同的版本:

  • 版本1: 基于時間和節點 ID 生成的 UUID
  • 版本2: DCE 安全的 UUID
  • 版本3: 通過命名空間標識符和名稱進行散列得到的 UUID,使用 MD5 散列
  • 版本4: 隨機生成的 UUID
  • 版本5: 通過命名空間標識符和名稱進行散列得到的 UUID,使用 SHA-1 散列

不同版本的版本號標志在 UUID 的第 7 字節處(xxxxxxxx-xxxx-Mxxx-xxxx-xxxxxxxxxxxx 即此處的 M 即為版本號)

google/uuid 生成 UUID

版本1

版本1的 UUID 根據 60 比特的時間戳和節點的 48 比特 MAC 地址(尾部 12 個字符)組成。此外還有 14 比特的時鐘序列用于擴展時間戳,以便處理處理器時鐘不能足夠快地前進的情況。剩下的 6 比特即為版本號和變體標志。(UUID 總長 128 比特)

利用 google/uuid 庫的 NewUUID 接口即可生成 RFC 版本號為1的 UUID。

示例代碼如下:

package mainimport ("fmt""github.com/google/uuid"
)func main() {// 生成一個新的 UUIDnewUUID, _ := uuid.NewUUID()fmt.Printf("Generated UUID: %s\n", newUUID)// 獲取并打印UUID的變體variant := newUUID.Variant()fmt.Printf("UUID Variant: %d\n", variant)// 獲取并打印UUID的版本version := newUUID.Version().String()fmt.Println(version)
}

版本4

版本4的 UUID 仍會使用 6 比特的空間標識版本號和變體標識,剩余的 122 比特隨機生成,故版本4可以生成 2^122 種不同的 UUID,如此龐大的隨機空間很難出現相同的 UUID,因此隨機生成的 UUID 仍然能夠提供足夠的唯一性保證。

利用 google/uuid 庫的 New 接口即可生成 RFC 版本號為4的 UUID。

示例代碼如下:

package mainimport ("fmt""github.com/google/uuid"
)func main() {// 生成一個新的 UUIDnewUUID := uuid.New()fmt.Printf("Generated UUID: %s\n", newUUID)// 獲取并打印UUID的變體variant := newUUID.Variant()fmt.Printf("UUID Variant: %d\n", variant)// 獲取并打印UUID的版本version := newUUID.Version().String()fmt.Println(version)
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38843.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38843.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php 通過vendor文件 生成還原最新的composer.json

起因:因為歷史原因,在本項目中composer.json基本算廢了,沒法直接使用composer管理擴展,今天嘗試修復一下composer.json。 歷史文件,可以看出來已經很久沒有維護了,我們主要是恢復require的信息 {"na…

K8s節點維護流程

用途 用于下線異常節點、集群縮容等 操作步驟 1. 查看節點名稱 先確認節點的名稱 kubectl get node -o wide2. 設置節點不可調度 設置節點不可調度狀態,禁止新的pod調度到該節點上 kubectl cordon ${node_name}3. 剔除節點上運行的pod(生產環境慎…

Spring Boot中集成Redis實現緩存功能

Spring Boot中集成Redis實現緩存功能 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天我們將深入探討如何在Spring Boot應用程序中集成Redis,實現…

AP無法上線原因分析及排障

一、AP未分配到IP地址 如果遇到AP無法上線問題,可以檢查下AP是否分配到IP地址。AP獲取IP地址有兩種方式:靜態方式:登錄到AP設備,手工配置IP地址,該方式操作起來比較麻煩,不推薦使用;DHCP方式&am…

基于CNN的股票預測方法【卷積神經網絡】

基于機器學習方法的股票預測系列文章目錄 一、基于強化學習DQN的股票預測【股票交易】 二、基于CNN的股票預測方法【卷積神經網絡】 文章目錄 基于機器學習方法的股票預測系列文章目錄一、CNN建模原理二、模型搭建三、模型參數的選擇(1)探究window_size…

下代iPhone或回歸可拆卸電池,蘋果這操作把我看傻了

剛度過一個愉快的周末,蘋果又雙叒叕攤上事兒了。 iPhone13 系列被曝扎堆電池鼓包了。 早在去年,就有 iPhone13 和 iPhone14 用戶反饋過類似的問題,表示在手機僅僅使用了一年多的時間就出現了電池鼓包的情況,而且還把屏幕給撐起來了…

舞會無領導:一種樹形動態規劃的視角

沒有上司的舞會 Ural 大學有 𝑁 名職員,編號為1~𝑁。 他們的關系就像一棵以校長為根的樹,父節點就是子節點的直接上司。 每個職員有一個快樂指數,用整數 𝐻𝑖 給出,其中1≤&…

校園卡手機卡怎么注銷?

校園手機卡的注銷流程可以根據不同的運營商和具體情況有所不同,但一般來說,以下是注銷校園手機卡的幾種常見方式,我將以分點的方式詳細解釋: 一、線上注銷(通過手機APP或官方網站) 下載并打開對應運營商的…

C++ 指針介紹

指針是C編程語言中的一個強大且重要的特性。它允許程序員直接操作內存地址,從而提供了對低級別內存的訪問和控制。雖然指針在使用時可能比較復雜且容易出錯,但它們在提高程序效率和靈活性方面有著不可替代的作用。本文將介紹C指針的基本概念、用法及其應…

Docker 中 MySQL 遷移策略(單節點)

目錄 一、 簡介二、操作流程2.1 進入mysql容器2.2 導出 MySQL 數據2.3. 將導出的文件復制到宿主機2.4 創建 Docker Compose 配置2.5 啟動新的 Docker 容器2.6 導入數據到新的容器2.7 驗證數據2.8 刪除舊的容器(刪除操作需慎重) 三、推薦配置四、寫在后面…

當年很多跑到美加澳寫代碼的人現在又移回香港?什么原因?

當年很多跑到美加澳寫代碼的人現在又移回香港?什么原因? 近年來,確實有部分曾經移民到美國、加拿大、澳大利亞等地的香港居民選擇移回香港。這一現象與多種因素相關,主要可以歸結為以下幾點: 疫情后的環境變化&#…

【STM32】溫濕度采集與OLED顯示

一、任務要求 1. 學習I2C總線通信協議,使用STM32F103完成基于I2C協議的AHT20溫濕度傳感器的數據采集,并將采集的溫度-濕度值通過串口輸出。 任務要求: 1)解釋什么是“軟件I2C”和“硬件I2C”?(閱讀野火配…

2025第13屆常州國際工業裝備博覽會招商全面啟動

常州智造 裝備中國|2025第13屆常州國際工業裝備博覽會招商全面啟動 2025第13屆常州國際工業裝備博覽會將于2025年4月11-13日在常州西太湖國際博覽中心盛大舉行!目前,各項籌備工作正穩步推進。 60000平米的超大規模、800多家國內外工業裝備制造名企將云集…

C++中的RAII(資源獲取即初始化)原則

C中的RAII(Resource Acquisition Is Initialization,資源獲取即初始化)原則是一種管理資源、避免資源泄漏的慣用法。RAII是C之父Bjarne Stroustrup提出的設計理念,其核心思想是將資源的獲取(如動態內存分配、文件句柄、…

最細最有條理解析:事件循環(消息循環)是什么?進程與線程的定義、關系與差異

目錄 事件循環:引入 一、瀏覽器的進程模型 1.1、什么是進程(Process) 1.2、什么是線程(Thread) 1.3、進程與線程之間的關系聯系與區別 二、瀏覽器有哪些進程和線程 2.1、瀏覽器的主要進程 ①瀏覽器進程 ②網絡…

ctfshow sqli-libs web561--web568

web561 ?id-1 or 1--?id-1 union select 1,2,3--?id-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_nameflags),3-- Your Username is : id,flag4s?id-1 union select 1,(select group_concat(flag4s) from ctfshow.f…

擴展學習|風險評估和風險管理:回顧其基礎上的最新進展

文獻來源:[1]Aven, T. (2016). Risk assessment and risk management: Review of recent advances on their foundation. European journal of operational research, 253(1), 1-13. 文章簡介:大約30-40年前,風險評估和管理被確立為一個科學領…

數據結構 - C/C++ - 鏈表

目錄 結構特性 內存布局 結構樣式 結構拓展 單鏈表 結構定義 節點關聯 插入節點 刪除節點 常見操作 雙鏈表 環鏈表 結構容器 結構設計 結構特性 線性結構的存儲方式 順序存儲 - 數組 鏈式存儲 - 鏈表 線性結構的鏈式存儲是通過任意的存儲單元來存儲線性…

技術分享:分布式數據庫DNS服務器的架構思路

DNS是企業數字化轉型的基石。伴隨微服務或單元化部署的推廣,許多用戶也開始采用分布式數據庫將原來的單體數據庫集群服務架構拆分為大量分布式子服務集群,對應不同的微服務或服務單元。本文將從分布式數據庫DNS服務器的架構需求、架構分析兩方面入手&…

1_插入排序_循環不變式

01_插入排序 #include<stdio.h>void insert_sort(int arr[], int n); void printArray(int arr[], size);int main() {int arr[] {1, 2, 3, 22, 5, 9};int n sizeof(arr) / sizeof(arr[0]);printf("打印原始數組:\n");prinfArray(arr, n);insert_sort(arr, …