分布式高并发情况下 UUID 会重复吗?

2018 年 9 月 12 日
 CUMTProgrammer
41099 次点击
所在节点    程序员
23 条回复
lihongming
2018 年 9 月 12 日
会,但概率比中 500 万低多了,一般没必要花时间在这个问题上,因为这点错误通常不值那么多钱(远低于开发成本)
zeromake
2018 年 9 月 12 日
可以考虑加入些变量,比如每个节点的 IP 之类的
geelaw
2018 年 9 月 12 日
上古时期的生成算法直接存下来了 MAC,所以不同机器上的不会重复。同一个机器上,只要时间没有回跳,(好像)是 340 年内不会重复的。

我不清楚最新的生成算法是怎么样的,据说基本上全是伪随机数生成器出来的。

扩展阅读:

CoCreateGuid API

https://docs.microsoft.com/en-us/windows/desktop/api/combaseapi/nf-combaseapi-cocreateguid

Use CoCreateGuid when you need an absolutely unique number that you will use as a persistent identifier in a __distributed__ environment.

UuidCreate API

https://docs.microsoft.com/en-us/windows/desktop/api/rpcdce/nf-rpcdce-uuidcreate
puperSB
2018 年 9 月 12 日
@zeromake uuid 的生成不是包括了网卡 mac 地址吗
mcfog
2018 年 9 月 12 日
先说清楚 uuid 几再讨论
kkk330
2018 年 9 月 12 日
id 生成器
w292614191
2018 年 9 月 12 日
加入毫秒数啊,我觉得这种问题特别弱。
tinybaby365
2018 年 9 月 12 日
完全的分布式,会,小概率。实际可以加上机器标识,时间信息,同时保证服务器时间不回退( Google 用原子钟)。
CUMTProgrammer
2018 年 9 月 12 日
@mcfog 就是 java.util.UUID
CUMTProgrammer
2018 年 9 月 12 日
@tinybaby365
@w292614191
UUID 已经 32 位了,再加太长了吧
gsggwbz
2018 年 9 月 12 日
snowflake 了解下
LittlePaper
2018 年 9 月 12 日
找个第三方库生成 version 1 的 uuid。java.util.UUID 好像只支持生成 version 3 和 version 4,用随机数的话数据量大,时间长了还是会重的。
blless
2018 年 9 月 12 日
用一个计数器服务生成呗 用得时候批量取就好
w292614191
2018 年 9 月 12 日
@CUMTProgrammer 我的做法是生成毫秒数,插入到 UUID 中间去,然后截取 32 位。
geelaw
2018 年 9 月 12 日
@LittlePaper #12 如果用随机来建模,前 6.8*10^(33) 个数出现重复的概率不超过 0.0001%

@w292614191 #14 这个做法是错误的。

@CUMTProgrammer #10 GUID 是 128 位二进制数,你是指 GUID 是 32 位十六进制数吗?
br00k
2018 年 9 月 12 日
还不如直接用 ObjectId😂
kernel
2018 年 9 月 12 日
@tinybaby365 随机的 32 字节 UUID 怎么可能会重复?你生成到太阳爆炸的那一天都不可能
kernel
2018 年 9 月 12 日
>>> (256**16)/1000000000/86400/365
1.0790283070806015e+22
每秒生成 1 亿条都要这么多年,这没算错吧
loveCoding
2018 年 9 月 12 日
雪花算法试试
zhangwugui
2018 年 9 月 12 日
正常来说,你的并发量如果不是贼大,基本上不会出现重复;
另外,Twitter 的 Snowflake 也是现在经常使用的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/488396

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX