Kai, j'ai fourni un programme qui fera ce que vous voulez en utilisant des fils. Sa licence est soumise aux conditions suivantes : vous devez me payer 0,0001 $ par heure et par cœur de CPU sur lequel vous l'exécutez. Les frais sont payables à la fin de chaque mois civil. Veuillez me contacter pour obtenir les détails de mon compte Paypal dès que possible.
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 : Je voulais essayer la bibliothèque Parallel extensions. C'était facile.
Et l'utilisation de OutOfMemoryException comme flux de contrôle ne semble pas correcte.
EDIT
Eh bien, il semble que cela attire toujours les votes. J'ai donc corrigé le problème de GC.KeepAlive(). Et je l'ai modifié pour qu'il fonctionne avec C# 4.
Et pour clarifier mes conditions de support : le support n'est disponible que le 28 février 2010. Veuillez utiliser une machine à remonter le temps pour faire des demandes de support ce jour-là uniquement.
EDIT 2 Comme toujours, le GC fait un meilleur travail que moi pour gérer la mémoire ; toutes les tentatives précédentes de le faire moi-même étaient vouées à l'échec.