Генерация случайного пароля навалом
Я использую этот исходный код для генерации случайных паролей:
public string GetRandomPasswordUsingGUID(int length)
{
// Get the GUID
string guidResult = System.Guid.NewGuid().ToString();
// Remove the hyphens
guidResult = guidResult.Replace("-", string.Empty);
// 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).ToUpper();
}
Он прекрасно работает, когда вы вызываете метод, но не в цикле "for".
В этом случае он генерирует некоторый повторный пароль, который является неправильным.
например вот так:
A4MNB597D7
AMGJCCC902
AWJ80CF6HX
A78EDJECIW
A78EDJECIW
A78EDJECIW
A78EDJECIW
A78EDJECIW
A2LYJCH23N
A2LYJCH23N
Как я могу создать случайный пароль в операторе цикла "For"?
5 ответов
GUID не случайны, они уникальны (в пределах одной системы). Даже генератор случайных чисел имеет ограничения, минимальные и максимальные значения, которые он будет возвращать, и, будучи действительно случайным, означает, что вы можете получать один и тот же результат снова и снова, вы просто не можете сказать.
Вы уверены, что имеете в виду случайное, а не сильное?
Итак, теперь у нас есть представление о том, что вы хотите 500 -1000 уникальных паролей. Я бы поставил под сомнение необходимость уникальности, поскольку предположил бы, что они предназначены для учетной записи пользователя, однако... (введено без удобной VS)
List<string> passwords = new List<string>();
while (passwords.Length < 1000)
{
string generated = System.Web.Security.Membership.GeneratePassword(
10, // maximum length
3) // number of non-ASCII characters.
if (!passwords.Contains(generated))
passwords.Add(generated);
}
И тогда у вас будет список из 1000 уникальных паролей, который может содержать не более 10 символов и 3 не-ASCII символов.
Это не ответ на конкретный вопрос, но именно поэтому ваше решение GUID не будет работать:
http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx
Если вы собираетесь генерировать случайные пароли в сборке, я настоятельно рекомендую не использовать "NewGuid()", потому что на основе алгоритма генерации сегментов UUID их основаны на уникальной временной метке ~100 мс.
Смотреть на:
http://en.wikipedia.org/wiki/Universally_unique_identifier
Лучше было бы создать справочную таблицу разрешенных символов и использовать статический объект "Случайный" и индексировать символы в таблице на основе сгенерированного случайного числа.
Вы можете использовать класс Membership от Asp.net, в который встроен генератор паролей. Он находится в пространстве имен System.Web.Security в dll System.Web.
// Generate a new 12-character password with 1 non-alphanumeric character.
string password = Membership.GeneratePassword(12, 1);
Более подробно здесь на MSDN: Membership.GeneratePassword Метод
Как ни странно, у вас были бы лучшие результаты, если бы вы использовали последние символы GUID, а не первые.
Чтобы ответить на ваш вопрос, достаточно примерно такого:
private static Random rng=new Random();
private static string PasswordAlphabet="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public string GetRandomPasswordUsingGUID(int length)
{
string result="";
while(length-->0)
result+=PasswordAlphabet[rng.Next(PasswordAlphabet.Length)];
return result;
}