首页 > 解决方案 > 如何以特定模式生成 UUID

问题描述

我正在尝试以特定模式在 Go 中生成 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: %s\n", u1)

    // or error handling
    u2:= uuid.NewV4()

    fmt.Printf("UUIDv4: %s\n", 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
    */
}

标签: gouuidguid

解决方案


UUID 为 128 位;那是一个足够大的空间,碰撞是非常不可能的。

来自https://en.wikipedia.org/wiki/Universally_unique_identifier

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

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

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

每秒生成 10 亿个 UUID 大约 85 年,一个包含这么多 UUID 的文件(每个 UUID 16 个字节)将是大约 45 艾字节,比目前存在的最大数据库大很多倍,大约数百PB。


推荐阅读