我在网上找到了这些代码:
http://www.java2s.com/Code/Java/Security/GeneratearandomStringsuitableforuseasatemporarypassword.htm
但我不太确定代码'逻辑。
public static String generateRandomPassword()
{
String letters = "abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789";
String pw = "";
for (int i=0; i<PASSWORD_LENGTH; i++)
{
int index = (int)(RANDOM.nextDouble()*letters.length());
pw += letters.substring(index, index+1);
}
return pw;
}
有人可以为我解释这两行代码,以便我能更好地理解吗?
int index = (int)(RANDOM.nextDouble()*letters.length());
pw += letters.substring(index, index+1);
谢谢。 :d
答案 0 :(得分:0)
此行将为您提供&#34;字母&#34;的索引。在数组letters
。
int index = (int)(RANDOM.nextDouble()*letters.length());
因为RANDOM.nextDouble()会返回&#34;分数&#34; (0.0d(含)到1.0d(不包括))乘以大小,即最后一个索引+ 1,因此它总是给出一个合适的索引。
pw += letters.substring(index, index+1);
将索引index
的字母添加到密码中。
答案 1 :(得分:0)
将字母视为字符数组而不是字符串。这有助于您理解。
RANDOM.nextDouble()
将从0.0到1.0的范围内创建一个随机双精度数。然后将它乘以String(字符数组)的长度,得到一个介于0.0和数组最后一个索引之间的数字。
(int)
将此数字转换为整数类型,这将截断小数,为您留下一个整数。然后将此号码保存到索引。
pw += letters.substring(index, index+1);
在索引和索引之后的索引之间删除一段字母String。从本质上讲,它只是抓取该索引处的字符,并将其添加到您的pw String。
该函数然后返回你的pw字符串,这是一个随机生成的字符串,字符串中可能有字符,长度为PASSWORD_LENGTH
答案 2 :(得分:0)
int index = (int)(RANDOM.nextDouble()*letters.length());
生成大于或等于0.0且小于1.0的随机双精度数。然后它将结果乘以可接受字母串的长度。基本上,在这两个步骤中,您的数字介于0(包括)和有效&#34;字母&#34;之间,但它是一个双精度数,因此它有一个小数部分。该数字被转换为int(整数)并保存到index
变量中。
pw += letters.substring(index, index+1);
使用pw
字符串的子字符串连接letters
。子串从上面一行确定的索引开始,到index + 1
结束(不包括index + 1
处的字符)。本质上,此部分在索引处生成一个字符的子字符串,该字符串由上面生成的随机整数确定。然后它将它连接到现有的pw
字符串。
步骤示例:
int index = (int)(RANDOM.nextDouble()*letters.length());
:
RANDOM.nextDouble()
=&gt; 0.51 letters.length()
=&gt; 60 RANDOM.nextDouble()*letters.length()
=&gt; 30.6 (int)(RANDOM.nextDouble()*letters.length())
=&gt; 30 pw += letters.substring(index, index+1);
:
letters.substring(index, index+1)
=&gt; &#34; H&#34; pw += letters.substring(index, index+1)
=&gt; &#34;&#34; +&#34; H&#34; =&GT; &#34; H&#34; 答案 3 :(得分:0)
人们已经解释了代码。但我想指出原始代码效率极低。你最好使用这段代码(遵循相同的逻辑):
static final char[] LETTERS = {'a', 'b', ..., '7', '8', '9'};
static final int WIDTH = LETTERS.length;
public static String generateRandomPassword()
{
char[] pw = new char[PASSWORD_LENGTH];
for (int i=0; i<PASSWORD_LENGTH; i++)
{
pw[i] = LETTERS[RANDOM.nextInt(WIDTH)];
}
return new String(pw);
}