webentwicklung-frage-antwort-db.com.de

So generieren Sie eine zufällige Zeichenfolge und geben Sie die gewünschte Länge an, oder generieren Sie eine eindeutige Zeichenfolge nach der gewünschten Spezifikation

Es gibt eine Bibliothek zum Generieren von Zufallszahlen. Warum gibt es keine Bibliothek zum Generieren von Zufallsstrings?

Mit anderen Worten, wie Sie eine zufällige Zeichenfolge erstellen und die gewünschte Länge angeben, oder besser, eine eindeutige Zeichenfolge nach der gewünschten Spezifikation erzeugen, d.

Ich weiß, dass ich eine Guid (Globally Unique IDentifier) ​​erstellen kann, aber diese sind ziemlich lang, länger müssen sie sein.

int length = 8;
string s = RandomString.NextRandomString(length)
uniquestringCollection = new UniquestringsCollection(length)
string s2 = uniquestringCollection.GetNext();
34
HCP

Ich kann mich nicht erinnern, wo ich das bekommen habe. Wenn Sie wissen, von wem der Autor ursprünglich verfasst wurde, helfen Sie mir bitte, die Zuschreibung zu erteilen.

private static void Main()
{
    const string AllowedChars =
        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#@$^*()";
    Random rng = new Random();

    foreach (var randomString in RandomStrings(AllowedChars, 1, 16, 25, rng))
    {
        Console.WriteLine(randomString);
    }

    Console.ReadLine();
}

private static IEnumerable<string> RandomStrings(
    string allowedChars,
    int minLength,
    int maxLength,
    int count,
    Random rng)
{
    char[] chars = new char[maxLength];
    int setLength = allowedChars.Length;

    while (count-- > 0)
    {
        int length = rng.Next(minLength, maxLength + 1);

        for (int i = 0; i < length; ++i)
        {
            chars[i] = allowedChars[rng.Next(setLength)];
        }

        yield return new string(chars, 0, length);
    }
}
41
Jesse C. Slicer

Wie wäre es mit-

    static Random rd = new Random();
    internal static string CreateString(int stringLength)
    {
        const string allowedChars = "[email protected]$?_-";
        char[] chars = new char[stringLength];

        for (int i = 0; i < stringLength; i++)
        {
            chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
        }

        return new string(chars);
    }
16
Jason Quinn

Ich verwende häufig Code wie den folgenden, um eine zufällige Zeichenfolge zu generieren:

internal static class Utilities {
  static Random randomGenerator = new Random();
  internal static string GenerateRandomString(int length) {
    byte[] randomBytes = new byte[randomGenerator.Next(length)];
    randomGenerator.NextBytes(randomBytes);
    return Convert.ToBase64String(randomBytes);
  }
}

Dadurch wird eine Base64-codierte Zeichenfolge der vom Zufallsobjekt generierten Zufallsbytes erstellt. Es ist nicht fadensicher, daher müssen mehrere Threads es umschließen. Zusätzlich verwende ich ein statisches Random-Objekt, so dass zwei Aufrufe der Methode zur gleichen Zeit nicht den gleichen Anfangswert erhalten.

4
Joshua

Eine Bibliothek zum Erzeugen von zufälligen Zeichenfolgen wäre nicht sehr nützlich. Es wäre entweder zu einfach, so dass Sie es oft ohnehin ersetzen müssen, oder zu komplex, um alle möglichen Situationen abdecken zu können, die Sie ersetzen, weil es zu kompliziert zu bedienen ist.

Das Erstellen zufälliger Zeichenfolgen ist recht einfach, wenn Sie den Zufallsgenerator für Zahlen verwenden, wenn Sie die genauen Details Ihrer Anforderungen angeben. Es ist einfach effizienter, den Code für jede Situation spezifisch zu schreiben.

Wenn Sie eine eindeutige Zeichenfolge wünschen, gibt es zwei Möglichkeiten. Sie können entweder jede zufällige Zeichenfolge beibehalten, die erstellt wird, um die Eindeutigkeit zu überprüfen, oder Sie können sie wirklich lang machen, sodass es unwahrscheinlich ist, dass Duplikate vorhanden sind. Eine GUID macht das letztere (was erklärt, warum es so lange dauert), also gibt es bereits eine Implementierung dafür.

2
Guffa

Wie wäre es mit

string.Join("", Enumerable.Repeat(0, 100).Select(n => (char)new Random().Next(127))));

oder

var Rand = new Random(); string.Join("", Enumerable.Repeat(0, 100).Select(n => (char)Rand.Next(127))));

1
Ali Humayun

Zufällige Zeichenfolge mit verketteten GUIDs

Dieser Ansatz verwendet die Mindestanzahl an verketteten GUIDs, um eine zufällige Zeichenfolge der gewünschten Anzahl von Zeichen zurückzugeben. 

    /// <summary>
    /// Uses concatenated then SubStringed GUIDs to get a random string of the
    /// desired length. Relies on the randomness of the GUID generation algorithm.
    /// </summary>
    /// <param name="stringLength">Length of string to return</param>
    /// <returns>Random string of <paramref name="stringLength"/> characters</returns>
    internal static string GetRandomString(int stringLength)
    {
        StringBuilder sb = new StringBuilder();
        int numGuidsToConcat = (((stringLength - 1) / 32) + 1);
        for(int i = 1; i <= numGuidsToConcat; i++)
        {
            sb.Append(Guid.NewGuid().ToString("N"));
        }

        return sb.ToString(0, stringLength);
    }

Beispielausgabe mit einer Länge von 8:

39877037
2f1461d8
152ece65
79778fc6
76f426d8
73a27a0d
8efd1210
4bc5b0d2
7b1aa10e
3a7a5b3a
77676839
abffa3c9
37fdbeb1
45736489

Beispielausgabe mit einer Länge von 40 (beachten Sie die wiederholte '4' - in einer v4-GUID ist dies eine Hex-Ziffer, die immer eine 4 ist (effektiv 4 Bits entfernt)) - der Algorithmus könnte durch Entfernen der '4' verbessert werden um die Zufälligkeit zu verbessern, vorausgesetzt, dass die zurückgegebene Länge der Zeichenfolge kürzer sein kann als die Länge einer GUID (32 Zeichen) ...):

e5af105b73924c3590e99d2820e3ae7a3086d0e3
e03542e1b0a44138a49965b1ee434e3efe8d063d
c182cecb5f5b4b85a255a397de1c8615a6d6eef5
676548dc532a4c96acbe01292f260a52abdc4703
43d6735ef36841cd9085e56f496ece7c87c8beb9
f537d7702b22418d8ee6476dcd5f4ff3b3547f11
93749400bd494bfab187ac0a662baaa2771ce39d
335ce3c0f742434a904bd4bcad53fc3c8783a9f9
f2dd06d176634c5b9d7083962e68d3277cb2a060
4c89143715d34742b5f1b7047e8107fd28781b39
2f060d86f7244ae8b3b419a6e659a84135ec2bf8
54d5477a78194600af55c376c2b0c8f55ded2ab6
746acb308acf46ca88303dfbf38c831da39dc66e
bdc98417074047a79636e567e4de60aa19e89710
a114d8883d58451da03dfff75796f73711821b02

C # Fiddler-Demo: https://dotnetfiddle.net/Y1j6Dw

0
CJBS

Wie wäre es mit so etwas ...

static string GetRandomString(int lenOfTheNewStr)
{
    string output = string.Empty;
    while (true)
    {
        output = output + Path.GetRandomFileName().Replace(".", string.Empty);    
        if (output.Length > lenOfTheNewStr)
        {
            output = output.Substring(0, lenOfTheNewStr);
            break;
        }
    }
    return output;
}

Ausgabe

static void Main(string[] args)
{            
    for (int x = 0; x < 10; x++)
    {
        string output = GetRandomString(20);
        Console.WriteLine(output);
    }
    Console.ReadKey();
}

 

r323afsluywgozfpvne4
qpfumdh3pmskleiavi3x
nq40h0uki2o0ptljxtpr
n4o0rzwcz5pdvfhmiwey
sihfvt1pvofgxfs3etxg
z3iagj5nqm4j1f5iwemg
m2kbffbyqrjs1ad15kcn
cckd1wvebdzcce0fpnru
n3tvq0qphfkunek0220d
ufh2noeccbwyfrtkwi02

Online-Demo: https://dotnetfiddle.net/PVgf0k


Verweise
https://www.dotnetperls.com/random-string

0
D T

Sie haben irgendwie Ihre eigene Frage beantwortet; Es gibt keine RandomString () - Funktion, da Sie einen Zufallszahlengenerator verwenden können, um einen String einfach zu generieren.

1) Legen Sie den Zahlenbereich zwischen den ASCII - Zeichen fest, die Sie einschließen möchten

2) Hängen Sie jedes Zeichen an eine Zeichenkette an, bis die gewünschte Länge erreicht ist.

3) Steigen Sie auf und wiederholen Sie den Vorgang für jede benötigte Zeichenfolge (fügen Sie sie einem Array hinzu usw.).

Sicher würde das es tun?

0
Siyfion