Java 为什么我的密码生成代码不能按预期工作?
我想每次都生成一个唯一的密码。我正在使用此代码生成密码Java 为什么我的密码生成代码不能按预期工作?,java,random,password-generator,Java,Random,Password Generator,我想每次都生成一个唯一的密码。我正在使用此代码生成密码 import java.util.Random; public class PasswordGenerator { public static String generatePassword() { Random r[] = new Random[8]; r[0] = new Random(1234567); r[1] = new Random(7654321);
import java.util.Random;
public class PasswordGenerator
{
public static String generatePassword()
{
Random r[] = new Random[8];
r[0] = new Random(1234567);
r[1] = new Random(7654321);
r[2] = new Random(-1234567);
r[3] = new Random(-7654321);
r[4] = new Random(5463721);
r[5] = new Random(2743615);
r[6] = new Random(-9753214);
r[7] = new Random(-3125769);
Random x = new Random(2325671);
StringBuilder password = new StringBuilder();
int length = x.nextInt(5)+9;
password.setLength(length);
for(int i=0;i<length;i++)
{
x.setSeed(r[i%8].nextInt(500)*r[4].nextInt(900));
password.setCharAt(i,(char)(r[x.nextInt(256)%8].nextInt(95)+32));
}
return password.toString();
}
}
每次它生成相同的密码,即使我重新编译它。我应该修改什么来每次生成唯一的密码
最后工作代码
import java.util.Random;
public class PasswordGenerator
{
public static String generatePassword()
{
Random r[] = new Random[8];
for(int i=0;i<8;i++)
r[i] = new Random();
Random x = new Random();
StringBuilder password = new StringBuilder();
int length = x.nextInt(5)+9;
password.setLength(length);
for(int i=0;i<length;i++)
{
x.setSeed(r[i%8].nextInt(500)*r[4].nextInt(900));
password.setCharAt(i,(char)(r[x.nextInt(256)%8].nextInt(95)+32));
}
return password.toString();
}
}
import java.util.Random;
公共类密码生成器
{
公共静态字符串generatePassword()
{
随机r[]=新随机[8];
对于(int i=0;i
每次它都会生成相同的密码,即使在我重新编译它时也是如此。我应该修改什么来每次生成唯一的密码
您为9个随机变量实例中的每个实例显式提供了相同的种子:
Random r[] = new Random[8];
r[0] = new Random(1234567);
r[1] = new Random(7654321);
r[2] = new Random(-1234567);
r[3] = new Random(-7654321);
r[4] = new Random(5463721);
r[5] = new Random(2743615);
r[6] = new Random(-9753214);
r[7] = new Random(-3125769);
Random x = new Random(2325671);
不清楚为什么您甚至有多个Random
实例,但您不应该指定相同的种子-这将保证每次都得到相同的结果。只需使用Random
构造函数,它不接受种子,并且将根据当前时间选择种子(在现代版本中,如果您快速连续多次调用构造函数,可以使用一些jiggery扑克来避免使用相同的种子。)
看起来你在做各种各样的“聪明”混淆视听,试图使数据更随机-根据调用不同实例的next
的结果设置一个种子,等等。您使代码更难理解,但不再是随机的。您仍然使用预先确定的种子,具有确定性的RNG。那里没有变化的来源
此外,对于敏感信息,应使用而不是Random
这是因为您使用固定种子值实例化了随机实例:
r[0]=新随机数(1234567);
发件人:
如果使用相同的种子创建了两个Random实例,并且对每个实例进行了相同的方法调用序列,则它们将生成并返回相同的数字序列
那么:
r[0] = new Random(System.nanoTime());
时间值可能会为您提供一个良好的种子(=随机参数).我建议您使用无参数随机构造函数来声明随机对象,因为采用参数的构造函数设置种子,从而使随机对象成为原子对象。我在下面为您编写了一个示例,通过将密码长度设置为六
import java.util.Random;
public class PasswordGenerator
{
public static String generatePassword()
{
Random r[] = new Random[8];
r[0] = new Random();
r[1] = new Random();
r[2] = new Random();
r[3] = new Random();
r[4] = new Random();
r[5] = new Random();
r[6] = new Random();
r[7] = new Random();
Random x = new Random();
StringBuilder password = new StringBuilder();
int length = 6;
password.setLength(length);
for(int i=0;i<length;i++)
{
x.setSeed(r[i%8].nextInt(500)*r[4].nextInt(900));
password.setCharAt(i,(char)(r[x.nextInt(256)%8].nextInt(95)+32));
}
return password.toString();
}
public static void main(String []args){
System.out.println(PasswordGenerator.generatePassword());
}
}
import java.util.Random;
公共类密码生成器
{
公共静态字符串generatePassword()
{
随机r[]=新随机[8];
r[0]=新随机数();
r[1]=新随机数();
r[2]=新随机数();
r[3]=新随机数();
r[4]=新随机数();
r[5]=新随机数();
r[6]=新随机数();
r[7]=新随机数();
随机x=新随机();
StringBuilder密码=新建StringBuilder();
整数长度=6;
密码.setLength(长度);
对于(int i=0;看起来明白了。谢谢你们两位的帮助,现在它工作了。嗯……好的,我会记住的,再次感谢
import java.util.Random;
public class PasswordGenerator
{
public static String generatePassword()
{
Random r[] = new Random[8];
r[0] = new Random();
r[1] = new Random();
r[2] = new Random();
r[3] = new Random();
r[4] = new Random();
r[5] = new Random();
r[6] = new Random();
r[7] = new Random();
Random x = new Random();
StringBuilder password = new StringBuilder();
int length = 6;
password.setLength(length);
for(int i=0;i<length;i++)
{
x.setSeed(r[i%8].nextInt(500)*r[4].nextInt(900));
password.setCharAt(i,(char)(r[x.nextInt(256)%8].nextInt(95)+32));
}
return password.toString();
}
public static void main(String []args){
System.out.println(PasswordGenerator.generatePassword());
}
}