简单证明GUID不是唯一的
我想证明一个简单的测试程序中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#。
凯,我提供了一个程序,将使用线程来做你想做的事情。 它按照以下条款获得许可:您必须为每个运行它的CPU核心支付每小时0.0001美元。 费用在每个日历月末支付。 请尽早联系我以获取我的贝宝账户详情。
using System;
using System.Collections.Generic;
using System.Linq;
namespace GuidCollisionDetector
{
class Program
{
static void Main(string[] args)
{
//var reserveSomeRam = new byte[1024 * 1024 * 100]; // This indeed has no effect.
Console.WriteLine("{0:u} - Building a bigHeapOGuids.", DateTime.Now);
// Fill up memory with guids.
var bigHeapOGuids = new HashSet<Guid>();
try
{
do
{
bigHeapOGuids.Add(Guid.NewGuid());
} while (true);
}
catch (OutOfMemoryException)
{
// Release the ram we allocated up front.
// Actually, these are pointless too.
//GC.KeepAlive(reserveSomeRam);
//GC.Collect();
}
Console.WriteLine("{0:u} - Built bigHeapOGuids, contains {1} of them.", DateTime.Now, bigHeapOGuids.LongCount());
// Spool up some threads to keep checking if there's a match.
// Keep running until the heat death of the universe.
for (long k = 0; k < Int64.MaxValue; k++)
{
for (long j = 0; j < Int64.MaxValue; j++)
{
Console.WriteLine("{0:u} - Looking for collisions with {1} thread(s)....", DateTime.Now, Environment.ProcessorCount);
System.Threading.Tasks.Parallel.For(0, Int32.MaxValue, (i) =>
{
if (bigHeapOGuids.Contains(Guid.NewGuid()))
throw new ApplicationException("Guids collided! Oh my gosh!");
}
);
Console.WriteLine("{0:u} - That was another {1} attempts without a collision.", DateTime.Now, ((long)Int32.MaxValue) * Environment.ProcessorCount);
}
}
Console.WriteLine("Umm... why hasn't the universe ended yet?");
}
}
}
PS:我想试用并行扩展库。 那很简单。
使用OutOfMemoryException作为控制流只是感觉不对。
编辑
那么,这似乎仍然吸引了选票。 所以我修复了GC.KeepAlive()问题。 并将其更改为使用C#4运行。
并澄清我的支持条款:支持仅在28 / Feb / 2010提供。 请仅在当天使用时间机器提出支持请求。
编辑2一如既往,GC比我在内存管理方面做得更好; 以前任何尝试自己做的都注定要失败。
这将运行不止几个小时。 假设它以1 GHz的频率循环(它不会 - 它会比这慢很多),它将运行10790283070806014188970年。 这比宇宙年龄长约830亿倍。
假设摩尔定律成立,那么不运行这个程序要快得多,等待几百年,然后在数十亿倍的计算机上运行。 事实上,如果你等到CPU速度增加并且在运行之前购买一个新的CPU,任何需要花费更长时间才能运行的程序比CPU速度翻倍(大约18个月)将会更快完成(除非你编写它以便它可以暂停并在新硬件上恢复)。
GUID在理论上是非唯一的。 这是你的证明:
但是,如果太阳的整个输出功率都是针对执行这项任务的,那么它在完成之前就会变冷。
可以使用多种不同的策略来生成GUID,其中一些策略采取特殊措施来保证给定机器不会两次生成相同的GUID。 在特定算法中查找碰撞会显示您的特定GUID生成方法不好,但通常不会证明有关GUID的任何信息。
链接地址: http://www.djcxy.com/p/3767.html