Java UUID.randomUUID 发生冲突的概率有多大?

136

我需要在Java中创建一些唯一的文件,计划使用UUID.randomUUID来生成它们的名称。会不会出现冲突?我是否应该像下面这样做,或者我不用担心这个问题?

Integer attemptsToGenerateUUID = 1;

while (true) {
    UUID fileUUID = UUID.randomUUID();

    if (fileDoesNotExistwith this UUID name) {
        save file;
        break;
    }

    attemptsToGenerateUUID += 1;

    if (attemptsToGenerateUUID > 64) {
        return false;
    }
}

我注意到总有可能发生冲突。我只是想知道在我的情况下是否值得实现这个“故障保护”,以便在发生冲突时至少尝试几次获取唯一名称。 - daniels
1
负评。答案在侧边栏里。完成后标记为重复。 - djechlin
70
换个角度来看,计算机运行程序被陨石撞击爆炸的可能性比UUID碰撞的可能性更大。因此,如果您想要一个百分之百可靠的程序,在开始处理UUID碰撞之前,应该先解决陨石防御问题。 - gbtimmon
8
@gbtimmon这件事发生了- https://www.nytimes.com/2021/10/14/world/canada/meteorite-bed.html - Janac Meena
1个回答

270
根据wikipedia,关于随机UUID中重复的概率:
只有在未来100年内每秒生成10亿个UUID时,才会有大约50%的概率仅创建一个重复。换句话说,如果地球上的每个人都拥有6亿个UUID,则一个重复的概率约为50%。
我想Java的UUID实现也适用同样的推理。所以不用担心这个问题。

158
你的意思是说还有机会吗? - Jack
8
@Jack 是的,但是它非常非常低。 - Óscar López
18
我理解为更多是开玩笑的意思……感谢你详细的回答! - Jack
3
显然,没有人会玩powerball/lotto :) - nosbor
3
@ValerijDobler 很有可能你在代码中发现了一个错误,而不是 UUID 冲突 :) - irreal
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接