UUID簡介及Golang實現(xiàn)

簡介

UUID 的目的是讓分布式系統(tǒng)中的所有元素价淌,都能有唯一的辨識信息薄嫡,而不需要通過中心節(jié)點指定封断,無需考慮數(shù)據(jù)庫創(chuàng)建時的名稱重復問題掀序。

目前最廣泛應用的 UUID 是 RFC4122 協(xié)議規(guī)范的而昨,有時 GUID 也特指是微軟對標準 UUID 的實現(xiàn)救氯,其實 RFC4122 的作者之一也是微軟員工。

規(guī)范標準

Universally Unique IDentifier, UUID 是一個 128 位的數(shù)字歌憨,一般通過 32 個十六進制表示径密,被連字符分為五段,例如: 00d460f0-ec1a-4a0f-a452-1afb4b5d1686 躺孝。詳細標準可以參考 RFC4122

為了保證UUID的唯一性底桂,規(guī)范定義了包括網(wǎng)卡MAC地址植袍、時間戳、名字空間(Namespace)籽懦、隨機或偽隨機數(shù)于个、時序等元素,以及從這些元素生成UUID的算法暮顺。UUID的復雜特性在保證了其唯一性的同時厅篓,意味著只能由計算機生成。

版本

如上捶码,1 個 UUID 被連字符分為五段羽氮,形式為 8-4-4-4-12 的 32 個字符,其中的字母是 16 進制表示惫恼,而且大小寫無關(guān)档押。

UUID 本身也經(jīng)過了多個版本的演化,每個版本的算法都不同,其標準格式如下令宿。

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
    M: 表示版本號叼耙,只會是1 2 3 4 5
    N: 只會是 8 9 a b

Version 1, based on timestamp and MAC address (RFC 4122)
Version 2, based on timestamp, MAC address and POSIX UID/GID (DCE 1.1)
Version 3, based on MD5 hashing (RFC 4122)
Version 4, based on random numbers (RFC 4122)
Version 5, based on SHA-1 hashing (RFC 4122)

如下,簡單介紹各個版本的實現(xiàn)方法粒没。

  • V1 基于時間
    通過當前時間戳筛婉、機器 MAC 地址生成,因為 MAC 地址是全球唯一的癞松,從而間接的可以保證 UUID 全球唯一爽撒,不過它暴露了電腦的 MAC 地址和生成這個 UUID 的時間,從而一直被詬病拦惋。

  • V2 DCE安全
    和基于時間的 UUID 算法相同匆浙,但會把時間戳的前 4 位置換為 POSIX 的 UID 或 GID,不過這個版本在 UUID 規(guī)范中沒有明確指定厕妖,基本不會實現(xiàn)首尼。

  • V3 基于命名空間
    由用戶指定一個命名空間和一個具體的字符串,然后通過 MD5 散列來生成 UUID 言秸。不過這個版本按照規(guī)范描述软能,主要是是為了向后兼容,所以也很少用到举畸。

  • V4 基于隨機數(shù)
    根據(jù)隨機數(shù)或者偽隨機數(shù)生成 UUID 查排,這個版本也是有意或者無意之中 使用最多 的。

  • V5 基于名字空間
    其實和版本 3 類似抄沮,不過散列函數(shù)換成了 SHA1 跋核。

Golang實現(xiàn)

基于linux系統(tǒng)命令的實現(xiàn)
如果程序運行在linux系統(tǒng)上,可以使用系統(tǒng)命令 /usr/bin/uuidgen 生成uuid

> /usr/bin/uuidgen
89A26769-0582-447D-AB6B-F98082D2CA46
package main

import (
    "fmt"
    "log"
    "os/exec"
)

func main() {
    out, err := exec.Command("uuidgen").Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s \n", out)
}
// 89A26769-0582-447D-AB6B-F98082D2CA46
  • 基于 google 的包的實現(xiàn)
    install: go get -u -v github.com/google/uuid
package main

import (
    "fmt"
    "github.com/google/uuid"
    "log"
)

func main() {
    // V1 基于時間
    u1, err := uuid.NewUUID()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(u1.String())

    // V4 基于隨機數(shù)
    u4 := uuid.New()
    fmt.Println(u4.String()) // a0d99f20-1dd1-459b-b516-dfeca4005203
}

google/uuid V4 源碼分析

package myuu

import (
    "crypto/rand"
    "encoding/hex"
    "io"
)

// 遵循 RFC4122 標準叛买,UUID為128 bit (16 字節(jié))
type UUID [16]byte

// `rand.Reader`是一個全局砂代、共享的密碼用強隨機數(shù)生成器
var rander = rand.Reader
// 定義一個類型為UUID的空值
var Nil UUID

func New() UUID {
    return Must(NewRandom())
}

// 發(fā)生異常時觸發(fā) panic
// V1版本此處不觸發(fā)panic,而是返回error
func Must(uuid UUID, err error) UUID {
    if err != nil {
        panic(err)
    }
    return uuid
}

func NewRandom() (UUID, error) {
    return NewRandomFromReader(rander)
}

// `io.ReadFull` 從 `rand.Reader` 精確地讀取len(uuid)字節(jié)數(shù)據(jù)填充進uuid
func NewRandomFromReader(r io.Reader) (UUID, error) {
    var uuid UUID
    _, err := io.ReadFull(r, uuid[:])
    if err != nil {
        return Nil, err
    }
    // 設(shè)置uuid版本信息
    uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4
    uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10
    return uuid, nil
}

func (uuid UUID) String() string {
    var buf [36]byte
    encodeHex(buf[:], uuid)
    return string(buf[:])
}

// 按照 8-4-4-4-12 的規(guī)則將 uuid 分段編碼率挣,使用 - 連接
func encodeHex(dst []byte, uuid UUID) {
    hex.Encode(dst, uuid[:4])
    dst[8] = '-'
    hex.Encode(dst[9:13], uuid[4:6])
    dst[13] = '-'
    hex.Encode(dst[14:18], uuid[6:8])
    dst[18] = '-'
    hex.Encode(dst[19:23], uuid[8:10])
    dst[23] = '-'
    hex.Encode(dst[24:], uuid[10:])
}

參考

https://jin-yang.github.io/post/uuid-introduce.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刻伊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子椒功,更是在濱河造成了極大的恐慌捶箱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件动漾,死亡現(xiàn)場離奇詭異丁屎,居然都是意外死亡,警方通過查閱死者的電腦和手機旱眯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門悦屏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來节沦,“玉大人,你說我怎么就攤上這事础爬「幔” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵看蚜,是天一觀的道長叫搁。 經(jīng)常有香客問我,道長供炎,這世上最難降的妖魔是什么渴逻? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮音诫,結(jié)果婚禮上惨奕,老公的妹妹穿的比我還像新娘。我一直安慰自己竭钝,他們只是感情好梨撞,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著香罐,像睡著了一般卧波。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庇茫,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天港粱,我揣著相機與錄音,去河邊找鬼旦签。 笑死查坪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的宁炫。 我是一名探鬼主播偿曙,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼淋淀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起覆醇,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤朵纷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后永脓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袍辞,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年常摧,在試婚紗的時候發(fā)現(xiàn)自己被綠了搅吁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片威创。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谎懦,靈堂內(nèi)的尸體忽然破棺而出肚豺,到底是詐尸還是另有隱情,我是刑警寧澤界拦,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布吸申,位于F島的核電站,受9級特大地震影響享甸,放射性物質(zhì)發(fā)生泄漏截碴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一蛉威、第九天 我趴在偏房一處隱蔽的房頂上張望日丹。 院中可真熱鬧,春花似錦蚯嫌、人聲如沸哲虾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妒牙。三九已至,卻和暖如春对妄,著一層夾襖步出監(jiān)牢的瞬間湘今,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工剪菱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摩瞎,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓孝常,卻偏偏與公主長得像旗们,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子构灸,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 隨機數(shù) 隨機數(shù)的性質(zhì)從弱到強分為3類: 詳見:計算機中的隨機數(shù) 1. 隨機性 2. 不可預測性 3. 不可重現(xiàn)性 ...
    七離_82cd閱讀 2,404評論 0 0
  • [TOC] 一上渴、簡介 UUID,是Universally Unique Identifier的縮寫喜颁,UUID出現(xiàn)的...
    沉默劍士閱讀 21,961評論 3 17
  • feisky云計算稠氮、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,855評論 0 5
  • 在線生成UUID:http://www.uuid.online/ 一、什么是UUID半开? UUID是Universa...
    ADark0915閱讀 901評論 0 2
  • 隨著人們對于教育的重視寂拆,很多家長重視孩子的多方面培養(yǎng)奢米,隨著生活水平的提高抓韩,除了物質(zhì)生活上的攀比,又出現(xiàn)了很多家長之...
    愛睡沙發(fā)的秋小姐閱讀 181評論 0 0