获得 Guid.NewGuid() 重复项的机会有多大? [重复]

问题描述 投票:0回答:6

可能重复:
GUID 100% 都是唯一的吗?
简单证明GUID不唯一

在 MSDN 中您可以阅读:

新 Guid 的值全为零或等于任何其他 Guid 的可能性非常低。

假设您有一个每秒创建一个文件的方法,并且您使用该方法

Guid.NewGuid()
对于文件名,是否有可能获得相同的Guid?或者本地计算机会以某种方式进行跟踪吗?机会有多低?

c# guid
6个回答
69
投票

即使您每秒生成数千个 GUID 的唯一目的是查找重复项,获得两个相同 GUID 的机会也是微乎其微。

“Astronomically slim”的意思是“几乎不可能发生”,而提到“实际上”部分只是为了科学正确性:实际上,你可以忽略“实际上”这个词,而将其视为简单的“不可能发生”。

所以,如果您担心,请停止担心。如果您正在对软件的某些奇怪行为进行故障排除,并且您怀疑这是由于发出了相同的 GUID,请停止怀疑并查找代码中的错误。


当然,如果你想听我的意见,我确实相信,从现在起的几千年后,我们将殖民银河系,我们的人口将达到数万亿,个人计算机的数量嵌入各处的数量将达到数不胜数,并且每台计算机都会以今天难以想象的速度生成 GUID,届时我们将开始遇到麻烦,因为在银河系的遥远区域每隔一段时间就会出现重复的 GUID ,然后就会像 640k 内存再次出现,DLL 地狱再次出现,两位数年份的千年错误再次出现,所有这些都加在一起。

GUID 的问题是,我们不希望它们太大,因为那样就会造成浪费,所以必须有人想出一些足够小的位,不会太浪费,但又足够大,可以提供防止碰撞的合理保证。所以,这是一种技术妥协。在我们这个世纪,128 位似乎是一个很好的折衷方案,但几乎可以在数学上确定,在下一个世纪,这种折衷方案将不再那么好。


23
投票

你永远不会用完指南。重复它们的可能性非常低:

http://betterexplained.com/articles/the-quick-guide-to-guids/


10
投票

总是存在一些极小的重复机会,但全球唯一标识符意味着:全球唯一......不是系统范围内唯一,而是在地球上唯一。

我推测,从理论上讲,与在单个系统上相比,在多个系统上复制 UUID 的机会更大。虽然操作系统不会存储它生成的每个 GUID,但它可能会使用一些基于时间的种子数据来避免自身冲突。当然这取决于实现。

哦,还有机会......好吧,有 3.4 x 10^38 可用,维基百科说你更有可能被陨石击中。

我还将提供另一种方法, Path.GetTempFileName() 方法可能值得研究,因为它具有防止碰撞的保护......尽管它在抛出异常之前只能创建 65,535 个唯一文件名 如果以前文件没有被删除

除此之外,这并不是很难做到:

string path;

do
{
    path = Guid.NewGuid().ToString(); // Format as needed

} while (File.Exists(path));

2
投票

请阅读以下问题以获取有关冲突的信息:GUID 冲突可能吗?

关于“每秒一个guid”,生成的guid通常会考虑时间,所以在同一台计算机上,除非更改内部时钟的设置,否则0机会生成相同的guid

编辑:显然关于guid的维基百科页面说在构建guid时时间不是强制性的,所以我想这取决于所使用的算法。由于我们谈论的是 C#(在 Windows 上?),它实际上是一个 UUID,其中 确实 在某些版本中包含计时。


1
投票

每秒创建 GUID 时,您不必担心会获得重复的 GUID。您可以参考 http://en.wikipedia.org/wiki/Universally_unique_identifier 并了解重复 GUID 的概率。


0
投票

在 GUID 冲突之前,您肯定会耗尽磁盘空间或堵塞文件系统。只要在创建文件时优雅地处理错误就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.