简单证明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是一个128位数字
  • 如果不重新使用旧的GUID,则无法生成2 ^ 128 + 1或更多的GUID
  • 但是,如果太阳的整个输出功率都是针对执行这项任务的,那么它在完成之前就会变冷。

    可以使用多种不同的策略来生成GUID,其中一些策略采取特殊措施来保证给定机器不会两次生成相同的GUID。 在特定算法中查找碰撞会显示您的特定GUID生成方法不好,但通常不会证明有关GUID的任何信息。

    链接地址: http://www.djcxy.com/p/3767.html

    上一篇: Simple proof that GUID is not unique

    下一篇: What is the size limit of a post request?