Как сгенерировать случайную строку и указать желаемую длину, или лучше сгенерировать уникальную строку по спецификации, которую вы хотите - PullRequest
34 голосов
/ 06 января 2011

Существует библиотека для генерации случайных чисел, так почему же нет библиотеки для генерации случайных строк?

Другими словами, как сгенерировать случайную строку и указать желаемую длину или, что лучше, сгенерировать уникальную строку по спецификации, которую вы хотите, т.е. указать длину, мне достаточно уникальной строки в моем приложении.

Я знаю, что могу создать Guid (глобально уникальный IDentifier), но они довольно длинные, они должны быть длиннее.

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

Ответы [ 8 ]

41 голосов
/ 06 января 2011

Я не могу вспомнить, откуда я это взял, поэтому, если вы знаете, кто изначально это написал, пожалуйста, помогите мне дать атрибуцию.

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);
    }
}
16 голосов
/ 06 января 2011

Как насчет -

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

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

        return new string(chars);
    }
3 голосов
/ 06 января 2011

Я обычно использую код, подобный следующему, для генерации случайной строки:

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);
  }
}

Это создаст строку в кодировке Base64 случайных байтов, сгенерированных случайным объектом.Это не потокобезопасно, поэтому несколько потоков придется блокировать вокруг него.Кроме того, я использую статический объект Random, поэтому два вызова метода одновременно не получат одинаковое начальное начальное число.

2 голосов
/ 06 января 2011

Библиотека для генерации случайных строк была бы не очень полезна.Это будет либо слишком просто, так что вам все равно придется часто его заменять, либо слишком сложно, чтобы иметь возможность охватить любую возможную ситуацию, что вы замените его, потому что его сложно использовать.Строки довольно легко, используя генератор случайных чисел, учитывая точные детали ваших потребностей.Просто эффективнее писать код специально для каждой ситуации.

Если вам нужна уникальная строка, есть две возможности.Вы можете сохранить каждую созданную случайную строку, чтобы проверить уникальность, или сделать ее действительно длинной, чтобы исключить вероятность дублирования.GUID выполняет последнее (что объясняет, почему он такой длинный), поэтому для этого уже есть реализация.

1 голос
/ 27 февраля 2019

Как насчет

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

или

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

0 голосов
/ 29 ноября 2018

Случайная строка с использованием сцепленных идентификаторов GUID

Этот подход использует минимальное количество сцепленных идентификаторов GUID для возврата случайной строки нужного количества символов.

    /// <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);
    }

Пример вывода с длиной 8:

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

Пример вывода с длиной 40 (обратите внимание на повторяющееся '4' - в GUID v4 у вас есть одна шестнадцатеричная цифра, которая всегда будет 4 (эффективно удаляя 4 бита) - алгоритм можно улучшить, удалив '4' для улучшения случайности, учитывая, что возвращаемая длина строки может быть меньше длины GUID (32 символа) ...):

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

C # Fiddler Демо: https://dotnetfiddle.net/Y1j6Dw

0 голосов
/ 31 августа 2018

Как на счет этого ...

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;
}

Вывод

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

Демонстрация онлайн: https://dotnetfiddle.net/PVgf0k


Ссылки
https://www.dotnetperls.com/random-string

0 голосов
/ 06 января 2011

Вы как бы ответили на свой вопрос; Функция RandomString () отсутствует, поскольку вы можете легко использовать генератор случайных чисел для генерации строки.

1) Задайте диапазон чисел между символами ASCII, которые вы хотите включить

2) Добавляйте каждый символ в строку, пока не будет достигнута желаемая длина.

3) Поднимитесь и повторите для каждой необходимой строки (добавьте их в массив и т. Д.)

Конечно, это будет делать?

...