Уникальное поколение случайной строки

Я хотел бы генерировать случайные уникальные строки как те сгенерированные библиотекой MSDN. (Ошибочный Объект), например. Строка как 't9zk6eay' должна быть сгенерирована.

91
задан Rich Warrior 21 August 2019 в 19:17
поделиться

6 ответов

Использование Guid было бы довольно хорошим способом, но чтобы получить что-то похожее на ваш пример, вы, вероятно, захотите преобразовать его к строке Base64:

    Guid g = Guid.NewGuid();
    string GuidString = Convert.ToBase64String(g.ToByteArray());
    GuidString = GuidString.Replace("=","");
    GuidString = GuidString.Replace("+","");

Я избавляюсь от «=» и «+», чтобы немного приблизиться к вашему примеру, в противном случае вы получите «==» в конце вашей строки и «+» в середине. Вот пример выходной строки:

"OZVV5TpP4U6wJthaCORZEQ"

75
ответ дан Mark Synowiec 24 November 2019 в 06:38
поделиться

Я бы предупредил, что GUID - это , а не случайные числа . Они не должны использоваться в качестве основы для создания чего-либо, что вы ожидаете быть абсолютно случайным (см. http://en.wikipedia.org/wiki/Globally_Unique_Identifier ):

Криптоанализ генератора WinAPI GUID показывает, что, поскольку последовательность идентификаторов GUID V4 является псевдослучайной, с учетом начального состояния можно прогнозировать до 250 000 идентификаторов GUID, возвращаемых функцией UuidCreate. Вот почему GUID не следует использовать в криптографии, например, в качестве случайных ключей. Вместо этого просто используйте метод C # Random. Примерно так (код найден здесь ):

private string RandomString(int size)
{
  StringBuilder builder = new StringBuilder();
  Random random = new Random();
  char ch ;
  for(int i=0; i<size; i++)
  {
    ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))) ;
    builder.Append(ch);
  }
  return builder.ToString();
}

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

Редактировать . Microsoft говорит, что Random тоже не так уж хорош ( http://msdn.microsoft.com/en-us/library/system.random (VS.71) .aspx ):

Чтобы сгенерировать криптографически безопасное случайное число, подходящее для создания случайного пароля, например, используйте класс, производный от System.Security.Cryptography.RandomNumberGenerator, например System.Security.Cryptography.RNGCryptoServiceProvider.

38
ответ дан Keltex 24 November 2019 в 06:38
поделиться

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

Всякий раз, когда Мне нужен какой-то случайный идентификатор, я обычно использую GUID и конвертирую его в «голое» представление:

Guid.NewGuid().ToString("n");
11
ответ дан Lucero 24 November 2019 в 06:38
поделиться

Это было запрошено на разных языках. Вот один вопрос о паролях , который должен быть применим и здесь.

Если вы хотите использовать строки для сокращения URL-адреса, вам также потребуется проверка словаря <> или базы данных, чтобы увидеть, использовался ли уже созданный идентификатор.

0
ответ дан Community 24 November 2019 в 06:38
поделиться
  • не уверен, что ссылки Microsoft генерируются случайным образом
  • , посмотрите на новый Guid (). ToString ()
-1
ответ дан Fabian Vilers 24 November 2019 в 06:38
поделиться

Получить уникальный ключ, используя хеш-код GUID

public static string GetUniqueKey(int length)
{
    string guidResult = string.Empty;

    while (guidResult.Length < length)
    {
        // Get the GUID.
        guidResult += Guid.NewGuid().ToString().GetHashCode().ToString("x");
    }

    // Make sure length is valid.
    if (length <= 0 || length > guidResult.Length)
        throw new ArgumentException("Length must be between 1 and " + guidResult.Length);

    // Return the first length bytes.
    return guidResult.Substring(0, length);
}
-1
ответ дан Chris Doggett 24 November 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: