生成不仅唯一的密码字母

本文关键字:密码 码字 唯一 | 更新日期: 2023-09-27 18:03:56

我的密码生成器有问题。

    var listOfCharacters = "abcdefghijklmnopqrstuvwxyz"
    chars = listOfCharacters.ToCharArray();
} // RB: I've reformatted the code, but left this brace in. 
  //     I think it should be removed though... 
string password = string.Empty;
for (int i = 0; i < length; i++) // length = 64
{
    int x = random.Next(0, chars.Length); // chars.Lenght = 26 
    if (!password.Contains(chars.GetValue(x).ToString()))
        password += chars.GetValue(x);
    else
        i--;
 }
 if (length < password.Length) password = password.Substring(0, length); //stucks here at 26 because all the 26 chars from the list are used one time so there are no more chars to use, but i want to use a char more than one time
 return password;

我的问题是:当我想创建一个64个字符的密码,我使用的字符列表从例子26他停止生成在26,因为他只需要所有的26个字符从列表只是1次。我需要在我的代码上面的方法采取1个字符多于一个,所以不仅每个字符只是1次,但通过例子,他可以采取字母"a"3次。

生成不仅唯一的密码字母

你的代码有一个显式的检查,以确保你只使用一个字符最多1次。

if (!password.Contains(chars.GetValue(x).ToString()))
    password += chars.GetValue(x);
else
    i--;

删除这个检查,你应该没事!

password += chars.GetValue(x);

编辑:

请找到下面你应该有确切的代码。

for (int i = 0; i < length; i++) // length = 64
{
    int x = random.Next(0, chars.Length); // chars.Lenght = 26 
    password += chars.GetValue(x);
}

我已经更新了你的代码,所以它一次添加所有的字符,如果更多的字符是必要的(长度> 26),然后它开始添加每个字符再次。因此,最多26个字符的密码有唯一字符,最多52个字符的密码每个可能的字符有两次,等等。

var listOfCharacters = "abcdefghijklmnopqrstuvwxyz";
var chars = listOfCharacters.ToList();
string password = string.Empty;
for (int i = 0; i < length; i++) {
    int x = random.Next(0, chars.Count);
    password += chars[x];
    chars.RemoveAt(x);
    if (chars.Count == 0)
        chars = listOfCharacters.ToList();
 }
 if (length < password.Length) password = password.Substring(0, length);
 return password;

您只能添加尚未添加到密码中的字符:

if (!password.Contains(chars.GetValue(x).ToString()))

一旦所有的26个字符被添加,它就不会再添加了

试试这个:

string password = string.Empty;
for (int i = 0; i < length; i++)
{
    int x = random.Next(0, chars.Length);
    password += chars.GetValue(x);
}