赞
踩
通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为自由软件基金会组织在分散式计算环境领域的一部份。
UUID的目的,是让分散式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。
如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前最广泛应用的UUID,是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、Mac OS X等等。
- //目前,golang中的uuid还没有纳入标准库,我们使用github上的开源库:
-
- go get -u github.com/satori/go.uuid
简单使用:
- package main
-
- import (
- "fmt"
- uuid "github.com/satori/go.uuid"
- )
-
- func main() {
- id := uuid.NewV4()
- ids := id.String()
- fmt.Println(ids)
- }
- package main
-
- import (
- "fmt"
- "github.com/satori/go.uuid"
- )
-
- func main() {
- // 生成版本 4 的 UUID NewV4返回随机生成的UUID。
- // 由于是基于随机数生成的,其自然的唯一性非常高,几乎不需要额外的措施来保证
- u1 := uuid.NewV4()
- fmt.Println("UUID v4:", u1)
-
- // 从字符串解析 UUID
- u, err := uuid.FromString(u1.String())
- if err != nil {
- fmt.Println("解析错误:", err)
- } else {
- fmt.Println("解析的 UUID:", u)
- }
-
- // 生成两个 UUID
- u2 := uuid.NewV4()
- u3 := uuid.NewV4()
-
- // 比较两个 UUID 是否相等
- if u2 == u3 {
- fmt.Println("UUID一样")
- } else {
- fmt.Println("UUID不一样")
- }
-
- // 生成版本 1 的 UUID NewV1根据当前时间戳和MAC地址返回UUID。
- // 使用时间戳和机器的MAC地址,这进一步增加了UUID的唯一性
- u4 := uuid.NewV1()
- fmt.Println("UUID v1:", u4)
-
- // 使用 Must 方法避免错误处理
- // 使用 Must 方法生成 UUID,如果生成失败将导致 panic
- u5 := uuid.Must(uuid.NewV4(), nil)
- fmt.Println("UUID v4 (Must):", u5)
- }
UUID(Universally Unique Identifier)的设计目标就是在全球范围内提供唯一性。不同版本的UUID通过不同的策略来确保这种唯一性:
Version 1 (时间戳 + MAC地址): 基于当前时间戳和机器的MAC地址生成。由于时间戳确保了随时间的递增,而MAC地址理论上是全球唯一的,两者的组合通常能确保UUID的唯一性。但是,使用MAC地址可能会引发隐私问题。
Version 2 (时间戳 + MAC地址 + DCE安全属性): 类似于V1,增加了DCE安全属性,主要用于分布式计算环境。同样依赖于MAC地址,有相同的隐私考虑。
Version 3 (命名空间 + MD5): 使用一个命名空间(如URL、OID等)和一个名字,通过MD5散列算法生成UUID。只要命名空间和名字的组合是唯一的,生成的UUID也是唯一的。这依赖于输入数据的唯一性。
Version 4 (随机数): 完全基于随机数生成,其中部分比特按照特定规则设置(如版本号和变体)。因为使用了随机性,理论上只要随机数生成器是真随机的,生成的UUID就有极高的概率是唯一的。这是最常用的版本,尤其是在不需要基于时间或硬件特征的情况下。
Version 5 (命名空间 + SHA-1): 和V3相似,但使用SHA-1作为散列算法。这也需要命名空间和名字的唯一性来保证UUID的唯一性。
为了确保UUID的唯一性,开发者应根据应用场景选择合适的版本:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。