Java 在给定字符范围的情况下生成集合的所有字符串?

Java 在给定字符范围的情况下生成集合的所有字符串?,java,security,Java,Security,我需要计算机安全课程的帮助;在程序中,我需要在给定一组默认字符(字母、数字和一些特殊字符)的情况下生成字符串的所有可能组合。我只是不知道如何得到一个方法,循环通过所有正确的,给定一个可能的长度为1至10个字符。我能够创建一个简单的嵌套循环,可用于2位数字,但我认为必须有更好的方法将其缩放到10个字符,而不需要再次复制粘贴循环。lol。下面的第一个代码块是我对10位数字的尝试,下面的代码块是我对2位数字的尝试。任何帮助,即使是在理解如何解决这个问题方面,都将不胜感激,谢谢 String SALTC

我需要计算机安全课程的帮助;在程序中,我需要在给定一组默认字符(字母、数字和一些特殊字符)的情况下生成字符串的所有可能组合。我只是不知道如何得到一个方法,循环通过所有正确的,给定一个可能的长度为1至10个字符。我能够创建一个简单的嵌套循环,可用于2位数字,但我认为必须有更好的方法将其缩放到10个字符,而不需要再次复制粘贴循环。lol。下面的第一个代码块是我对10位数字的尝试,下面的代码块是我对2位数字的尝试。任何帮助,即使是在理解如何解决这个问题方面,都将不胜感激,谢谢

String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_$#-~";
    for(int i =1;i<11;i++) {
        String initialPW = StringUtils.repeat("a", i);
        StringBuilder potentialPW = new StringBuilder(initialPW);
        System.out.println("initial ps is "+initialPW);
        for (int j=0;j<67;j++) {

            String letterSwap = Character.toString(SALTCHARS.charAt(j));
            System.out.println("The swap letter is "+letterSwap);
            potentialPW.setCharAt(i-1, SALTCHARS.charAt(j));
            String saltStr = potentialPW.toString();
            System.out.println("The final pw guess is "+ saltStr); 
            for (int k = 0;k<i;k++) {
                potentialPW.setCharAt(k, SALTCHARS.charAt(j));
                saltStr = potentialPW.toString();
                System.out.println("The final pw guess is "+ saltStr); 
            }
        } 
    } 
String SALTCHARS=“abcdefghijklmnopqrstuvwxyzabdfghijklmnopqrstuvxyz1234567890_$#-~”;
对于(inti=1;iHmm),有趣吗

我想我可能有个可怕的主意

为了简单起见,我将使用两个有效字符
A
B
。 然后,假设我们要为长度为2的字符串生成这两个字符的所有可能序列:

我们可以用二维数组表示所有可能的2长度字符串。。。 然后,假设我们想找到所有可能的3长度字符串。。。

然后,我们可以通过迭代3D数组的每个元素,得到长度为3的字符串的
A
B
的所有可能组合。我们知道有8种可能的结果(2^3),实际上有8个“立方体”,即
AAA、AAB、ABA、ABB、BAA、BAB、BBA、BBB

等等。。。 对于长度为4的字符串,创建一个4维数组。。。 看,我告诉过你这是个可怕的主意

现在您只需要了解如何填充数组,然后可以使用array.deepToString之类的工具将其全部打印出来。。。 这很可怕,但我喜欢这样的想法:必须进入其他维度才能回答这个问题。

另一种建模方法 对这个问题建模的另一种可能方法是将其视为一组 链接的车轮(如车轮):

(忽略一帧,其中三轮有2个B,这是一个错误:p)

箭头指向“轮子”设置的组合

当第一个“轮子”完成旋转时,它将下一个“轮子”增加1。这将允许您循环所有可能的组合

这种行为可以通过创建一个具有“value”属性和“rotation”方法的wheel类来实现。每次调用rotation时,它都会循环遍历它的值。 创建一组这些轮子类,这样当第一个轮子完成一个完整的旋转/循环时,它将增加第二个轮子。然后,一旦第二个轮子完成一个旋转,将调用第三个轮子,依此类推

连接并打印程序每一步的控制盘值,这应该会起作用。

嗯……有趣吗

我想我可能有个可怕的主意

为了简单起见,我将使用两个有效字符
A
B
。 然后,假设我们要为长度为2的字符串生成这两个字符的所有可能序列:

我们可以用二维数组表示所有可能的2长度字符串。。。 然后,假设我们想找到所有可能的3长度字符串。。。

然后,我们可以通过迭代3D数组的每个元素,得到长度为3的字符串的
A
B
的所有可能组合。我们知道有8种可能的结果(2^3),实际上有8个“立方体”,即
AAA、AAB、ABA、ABB、BAA、BAB、BBA、BBB

等等。。。 对于长度为4的字符串,创建一个4维数组。。。 看,我告诉过你这是个可怕的主意

现在您只需要了解如何填充数组,然后可以使用array.deepToString之类的工具将其全部打印出来。。。 这很可怕,但我喜欢这样的想法:必须进入其他维度才能回答这个问题。

另一种建模方法 对这个问题建模的另一种可能方法是将其视为一组 链接的车轮(如车轮):

(忽略一帧,其中三轮有2个B,这是一个错误:p)

箭头指向“轮子”设置的组合

当第一个“轮子”完成旋转时,它将下一个“轮子”增加1。这将允许您循环所有可能的组合

这种行为可以通过创建一个具有“value”属性和“rotation”方法的wheel类来实现。每次调用rotation时,它都会循环遍历它的值。 创建一组这些轮子类,这样当第一个轮子完成一个完整的旋转/循环时,它将增加第二个轮子。然后,一旦第二个轮子完成一个旋转,将调用第三个轮子,依此类推


连接并打印程序每一步的控制盘值,这应该会起作用。

您需要使用回溯来生成给定长度上的所有字符组合。如果生成的字符串的长度不固定,则需要使用递归,否则需要编写那么多嵌套循环。我编写了一个简单的C++程序,它们也一样。但是,对于长度[1,10],可能有很多可能的组合,并且创建它们的所有结果都会导致系统中的堆栈溢出(因为我使用递归)。。但您可以浏览代码并了解执行此操作的基本思想。如果您想执行此代码以检查它,我建议您将hi的值更改为较低的值(可能为2-3)或将域大小缩小为较小的字符数,否则将导致堆栈溢出。(hi表示所生成字符串的所需上限长度)

#包括
使用名称空间std;
无效创建(i)
String[] possiblePasswords = new String[676];
    int position = 0;
    for (int i = 97;i<123;i++) {
        for (int j = 97;j<123;j++) {
            String firstLetter = Character.toString((char) i);
            String secondLetter = Character.toString((char) j);
            //System.out.println("Test for: "+ firstLetter+secondLetter);
            possiblePasswords[position] = firstLetter + secondLetter;
            position++;
        }
    }
    #include<bits/stdc++.h>
using namespace std;
void create(int i,string domain,vector<bool>& included,string str,int len)
{
    if(i==(len))
    {
        cout<<str<<endl;
        return;
    }
    for(int j=0;j<domain.length();j++)
    {
        if(included[j]==1)
        continue;
        else
        {
            included[j]=1;
            str+=domain[j];
            create(i+1,domain,included,str,len);
            included[j]=0;
            str.pop_back();
        }
    }
}
int main()
{
    string domain = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_$#-~";
    int lo=1;
    int hi=10;
    for(int i=lo;i<=hi;i++)
    {
        int len=i;
        string str;
        vector<bool> included(domain.length(),0);
        create(0,domain,included,str,len);
    }
   return 0;
}