如何以特定模式生成 UUID

  • 本文关键字:UUID 模式 go uuid guid
  • 更新时间 :
  • 英文 :


我正在尝试以特定模式在 Go 中生成 UUID。我正在处理的程序需要生成类似于现有 uuid 字符串的各种 uuid。因此,程序将读取现有的uuid(其格式将来可能会更改)并生成相同格式的新uuid以替换现有uuid。

我使用"github.com/satori/go.uuid"包生成一个uuid。我正在使用的示例代码位于我在网上找到的示例代码下面。

由于该程序的多个实例将并行部署,因此我希望避免生成的uuid中的冲突或重复。

package main
import (
"fmt"
"github.com/satori/go.uuid"
)
func main() {
// Creating UUID Version 4
// panic on error
u1 := uuid.Must(uuid.NewV4(), nil)
fmt.Printf("UUIDv4: %sn", u1)
// or error handling
u2:= uuid.NewV4()
fmt.Printf("UUIDv4: %sn", u2)
/* Formats needed: 
2286664c688130096c9ce9008e4d97fb
6abb173a-b134-49f2-aa88-9dff5dab12a1 (This is obtained from the above code)
C8-3C-9C-64-61-70-62-B9-34-AC-9A-20-C9-EF-1D-6D
*/
}

UUID是128位;这是一个足够大的空间,碰撞的可能性非常小。

从 https://en.wikipedia.org/wiki/Universally_unique_identifier:

当根据标准方法生成时,UUID出于实际目的是唯一的,与大多数其他编号方案不同,它们的唯一性不依赖于中央注册机构或生成它们的各方之间的协调。虽然 UUID 被复制的概率不为零,但它足够接近于零,可以忽略不计。

因此,任何人都可以创建一个UUID,并使用它来识别某些东西,几乎可以肯定的是,该标识符不会重复已经或将要创建的标识符来识别其他内容。因此,由独立方标记的UUID信息以后可以合并到单个数据库中或在同一信道上传输,重复的可能性可以忽略不计。

UUID的全部意义,它们如此之大的原因,是为了避免在没有同步的情况下发生冲突。根据同一篇文章,为了达到50%的碰撞几率,需要:

大约 85 年的时间里每秒生成 10 亿个 UUID,而包含这么多 UUID 的文件(每个 UUID 16 字节)将约为 45 EB,比目前存在的最大数据库大很多倍,这些数据库大约是数百 PB 的量级。

相关内容

  • 没有找到相关文章

最新更新