1290 Stimmen

Wie kann ich zufällige alphanumerische Zeichenfolgen erzeugen?

Wie kann ich eine zufällige 8 Zeichen alphanumerische Zeichenfolge in C# generieren?

2 Stimmen

Welcher Rest

8 Stimmen

O s o s

2 Stimmen

Es wäre schön, wenn die Sprachlokalisierung in diese Frage einbezogen würde. Vor allem, wenn Ihre Benutzeroberfläche für Chinesisch oder Bulgarisch geeignet sein soll!

14voto

xanatos Punkte 105813

Der von Eric J. geschriebene Code ist ziemlich schlampig (es ist ganz klar, dass er von vor 6 Jahren stammt... er würde diesen Code heute wahrscheinlich nicht mehr schreiben), und es gibt sogar einige Probleme.

Im Gegensatz zu einigen der vorgestellten Alternativen ist diese kryptografisch einwandfrei.

Unwahr... Es gibt eine Verzerrung im Passwort (wie in einem Kommentar geschrieben), bcdefgh sind etwas wahrscheinlicher als die anderen (die a ist nicht, weil durch die GetNonZeroBytes keine Bytes mit einem Wert von Null erzeugt, so dass die Vorspannung für die a ausgeglichen wird), so dass es kryptografisch nicht wirklich solide ist.

Damit sollten alle Probleme behoben sein.

public static string GetUniqueKey(int size = 6, string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
{
    using (var crypto = new RNGCryptoServiceProvider())
    {
        var data = new byte[size];

        // If chars.Length isn't a power of 2 then there is a bias if
        // we simply use the modulus operator. The first characters of
        // chars will be more probable than the last ones.

        // buffer used if we encounter an unusable random byte. We will
        // regenerate it in this buffer
        byte[] smallBuffer = null;

        // Maximum random number that can be used without introducing a
        // bias
        int maxRandom = byte.MaxValue - ((byte.MaxValue + 1) % chars.Length);

        crypto.GetBytes(data);

        var result = new char[size];

        for (int i = 0; i < size; i++)
        {
            byte v = data[i];

            while (v > maxRandom)
            {
                if (smallBuffer == null)
                {
                    smallBuffer = new byte[1];
                }

                crypto.GetBytes(smallBuffer);
                v = smallBuffer[0];
            }

            result[i] = chars[v % chars.Length];
        }

        return new string(result);
    }
}

8voto

Tejas Punkte 447
 public static string RandomString(int length)
    {
        const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        var random = new Random();
        return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());
    }

8voto

Mr. Pumpkin Punkte 5815

Wir verwenden auch benutzerdefinierte Zeichenfolge zufällig, aber wir implementiert ist als ein String-Helfer, so dass es einige Flexibilität bietet ...

public static string Random(this string chars, int length = 8)
{
    var randomString = new StringBuilder();
    var random = new Random();

    for (int i = 0; i < length; i++)
        randomString.Append(chars[random.Next(chars.Length)]);

    return randomString.ToString();
}

Verwendung

var random = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Random();

ou

var random = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".Random(16);

8voto

Rob Deary Punkte 917

Eine etwas sauberere Version der Lösung des DTB.

    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    var random = new Random();
    var list = Enumerable.Repeat(0, 8).Select(x=>chars[random.Next(chars.Length)]);
    return string.Join("", list);

Ihre Stilvorlieben können variieren.

7voto

Arad Punkte 3591

Die einfachste und flexibelste Lösung mit kryptographischer Sicherheit (.NET Core 3.0+):

Wenn Sie .NET Core 3.0 oder höher verwenden, können Sie die neue statische GetInt32 Methode (die kryptographisch sicher ist) auf dem RandomNumberGenerator Klasse einen Zufallsindex für einen bestimmten Zeichensatz erzeugen und das Ergebnis auf diese Weise ganz einfach auffüllen.

Dieser Ansatz ist weitaus einfacher als beispielsweise der Ansatz, der in diese Antwort und bietet außerdem völlige Flexibilität, da Sie jeden beliebigen Zeichensatz eingeben können.

public static string GenerateRandomString(int length, IEnumerable<char> charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
{
    var charArray = charSet.Distinct().ToArray();
    char[] result = new char[length];
    for (int i = 0; i < length; i++)
        result[i] = charArray[RandomNumberGenerator.GetInt32(charArray.Length)];
    return new string(result);
}

Verwendung:

string randomAlphanumericString = GenerateRandomString(length: 10);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X