go 實現uuid
簡介
UUID 的目的是讓分布式系統中的所有元素,都能有唯一的辨識信息,而不需要通過中心節點指定,無需考慮數據庫創建時的名稱重復問題。
目前最廣泛應用的 UUID 是 RFC4122 協議規范的,有時 GUID 也特指是微軟對標准 UUID 的實現,其實 RFC4122 的作者之一也是微軟員工。
如下,簡單介紹各個版本的實現方法。
-
V1 基於時間
通過當前時間戳、機器 MAC 地址生成,因為 MAC 地址是全球唯一的,從而間接的可以保證 UUID 全球唯一,不過它暴露了電腦的 MAC 地址和生成這個 UUID 的時間,從而一直被詬病。 -
V2 DCE安全
和基於時間的 UUID 算法相同,但會把時間戳的前 4 位置換為 POSIX 的 UID 或 GID,不過這個版本在 UUID 規范中沒有明確指定,基本不會實現。 -
V3 基於命名空間
由用戶指定一個命名空間和一個具體的字符串,然后通過MD5
散列來生成 UUID 。不過這個版本按照規范描述,主要是是為了向后兼容,所以也很少用到。 -
V4 基於隨機數
根據隨機數或者偽隨機數生成 UUID ,這個版本也是有意或者無意之中 使用最多 的。 -
V5 基於名字空間
其實和版本 3 類似,不過散列函數換成了SHA1
。
基於 google 的包的實現 安裝包
go get -u -v github.com/google/uuid
package main import ( "crypto/md5" "fmt" "github.com/google/uuid" "io" "log" ) func strToMd5(data string) string { t := md5.New() io.WriteString(t, data) return fmt.Sprintf("%x", t.Sum(nil)) } func main() { // V1 基於時間 u1, err := uuid.NewUUID() if err != nil { log.Fatal(err) } fmt.Println(u1.String()) //uuid做md5轉換 u4 := uuid.New() fmt.Println("uuid v4結果", u4.String()) // a0d99f20-1dd1-459b-b516-dfeca4005203 c := strToMd5(u4.String()) fmt.Println("uuid做md5結果", c) }