Я хотел бы генерировать случайные уникальные строки как те сгенерированные библиотекой MSDN. (Ошибочный Объект), например. Строка как 't9zk6eay' должна быть сгенерирована.
Использование Guid было бы довольно хорошим способом, но чтобы получить что-то похожее на ваш пример, вы, вероятно, захотите преобразовать его к строке Base64:
Guid g = Guid.NewGuid();
string GuidString = Convert.ToBase64String(g.ToByteArray());
GuidString = GuidString.Replace("=","");
GuidString = GuidString.Replace("+","");
Я избавляюсь от «=» и «+», чтобы немного приблизиться к вашему примеру, в противном случае вы получите «==» в конце вашей строки и «+» в середине. Вот пример выходной строки:
"OZVV5TpP4U6wJthaCORZEQ"
Я бы предупредил, что 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.
Я не думаю, что они действительно случайны, но я предполагаю, что это некоторые хеши.
Всякий раз, когда Мне нужен какой-то случайный идентификатор, я обычно использую GUID и конвертирую его в «голое» представление:
Guid.NewGuid().ToString("n");
Это было запрошено на разных языках. Вот один вопрос о паролях , который должен быть применим и здесь.
Если вы хотите использовать строки для сокращения URL-адреса, вам также потребуется проверка словаря <> или базы данных, чтобы увидеть, использовался ли уже созданный идентификатор.
Получить уникальный ключ, используя хеш-код 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);
}