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