2017-10-11 2 views
-2

Ich implementierte eine Methode, die automatisch Buchstaben und Zahlen in zufälliger Weise generiert.Zufallsgenerator Kollision

public static string GenerateRandomNumber() 
{ 
    using (var rng = RandomNumberGenerator.Create()) 
    { 
     var bytes = new byte[8]; 

     rng.GetBytes(bytes); 

     return Convert.ToBase64String(bytes); 
    } 
} 

Was sind die Wahrscheinlichkeiten, dass diese randomNumberGenerator-Klasse eine Kollision erzeugen würde?

+0

Offensichtlich wird es irgendwann zu einer Kollision kommen, wenn Sie es mehr als einmal nennen ... Aber unmöglich, die richtige Antwort zu geben, ohne die Qualität Ihres Zufallsgenerators und die Anzahl der gewünschten Ergebnisse zu kennen. –

Antwort

0

Es hängt von der Implementierung von RandomNumberGenerator ab, aber momentan denke ich, dass die Wahrscheinlichkeit einer Kollision 100% ist, da Sie mit jedem Aufruf eine neue Instanz instanziieren. Wenn Sie System.Random verwenden, wäre das der Fall ... try it out on DotNetFiddle.

public class Program 
{ 
    public static string RandomNumber() 
    { 
     var rng = new System.Random(); 
     var bytes = new byte[8]; 

     rng.NextBytes(bytes); 

     return Convert.ToBase64String(bytes); 
    } 

    public static void Main() 
    { 
     Console.WriteLine(RandomNumber()); 
     Console.WriteLine(RandomNumber()); 
    } 
} 

Output (oops!):

EgNMBvntr1w= 
EgNMBvntr1w= 

Mein Vorschlag wäre nur eine Instanz von RandomNumberGenerator und hält es in einer statischen Variablen in der gesamten Lebensdauer Ihres Programms zu instanziieren. Wenn Sie es so machen, wird die Wahrscheinlichkeit eher 1 zu 2^64 sein.

+0

Nur um klarzustellen, ich verwende Random Number Generator, die System.Security.Criptography.Algorithmen Namespace C# -Sprache und nicht Sytem.Random() gehört –