我想证明一个GUID在一个简单的测试程序中不是唯一的。 我原以为下面的代码会运行几个小时,但它不起作用。我该怎么做呢?

BigInteger begin = new BigInteger((long)0);
BigInteger end = new BigInteger("340282366920938463463374607431768211456",10);  //2^128
for(begin; begin<end; begin++)
  Console.WriteLine(System.Guid.NewGuid().ToString());

我用的是c#。


当前回答

证明GUID不是唯一的唯一解决方案是建立一个World GUID池。每次在某个地方生成GUID时,都应该将其注册到组织。或者,我们可能包括一个标准化,所有GUID生成器都需要自动注册它,为此它需要一个活跃的互联网连接!

其他回答

证明GUID不是唯一的唯一解决方案是建立一个World GUID池。每次在某个地方生成GUID时,都应该将其注册到组织。或者,我们可能包括一个标准化,所有GUID生成器都需要自动注册它,为此它需要一个活跃的互联网连接!

如果你担心独特性,你可以购买新的guid,这样你就可以扔掉旧的guid。如果你愿意,我可以把一些放在易趣网上。

你可以用量子bogosort算法的变体在O(1)时间内证明这一点。

Guid g1 = Guid.NewGuid();
Guid g2 = Guid.NewGuid();
if(g1 != g2) Universe.Current.Destroy();

任何两个guid都很可能是唯一的(不相等)。

看看这个SO条目,来自维基百科

而每个生成的GUID不是 保证是唯一的,总数 唯一键数(2^128或 3.4×10^38)是如此之大,以至于相同数字的概率为 生成两次是非常小的。为 例子,考虑可观测 宇宙,其中包含约5×10^22 星星;每颗恒星都有可能 6.8×10^15个通用唯一的guid。

所以你可能还要再等几十亿年,希望在我们所知道的宇宙结束之前,你能击中一个。

这里也有一个解决方案:

int main()
{
  QUuid uuid;
  while ( (uuid = QUuid::createUuid()) != QUuid::createUuid() ) { }
  std::cout << "Aha! I've found one! " << qPrintable( uuid.toString() ) << std::endl;
}

注意:需要Qt,但我保证如果你让它运行足够长的时间,它可能会找到一个。

(注:实际上,现在我正在看它,可能有一些关于生成算法的东西可以防止两个随后生成的uuid发生碰撞——但我有点怀疑)。