我想生成字母和数字随机密码,我有两个开关,一个用于alpha,一个用于数字,当两个开关打开时,生成的字符串在alpha和numeric中也是当我的密码长度为4所以一些时间它只显示在alpha中,但我想要数字和alpha。
我的代码如下所示
if (switchLetters.isChecked() && switchDigits.isChecked()) {
randomString(mProgress, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", txtPassword);
}
String randomString(int len, String mPassword, TextView mTextView) {
SecureRandom rnd = new SecureRandom();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++)
sb.append(mPassword.charAt(rnd.nextInt(mPassword.length())));
mTextView.setText(sb.toString());
return sb.toString();
}
答案 0 :(得分:0)
Here是使用SecureRandom
生成安全随机字母和数字字符串的好例子import java.security.SecureRandom; import java.math.BigInteger;
public final class SessionIdentifierGenerator {
private SecureRandom random = new SecureRandom();
public String nextSessionId() {
return new BigInteger(130, random).toString(32);
}
}
Here是如何使用自定义长度生成字符串的示例。
答案 1 :(得分:0)
请尝试以下代码:
String randomString(int len, String mPassword, TextView mTextView) {
SecureRandom rnd = new SecureRandom();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++)
sb.append(mPassword.charAt(rnd.nextInt(mPassword.length())));
mTextView.setText(sb.toString());
return sb.toString();
}
private String generateAlphaNumericString(int len, String mPassword, TextView mTextView) {
String regexDigit = "\\d+";
String regexAlphabets = "[a-zA-Z]+";
String randomAlphaNumString;
do {
randomAlphaNumString = randomString(mProgress, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", txtPassword);
} while (while ((randomAlphaNumString.matches(regexDigit) || randomAlphaNumString.matches(regexAlphabets)));
return randomAlphaNumString;
}
答案 2 :(得分:0)
您可以通过字母池来选择,而无需区分字母和数字。如果你想确保两者都包括在内,那么你需要将它们分开更长时间。
TextView
参数是一个不必要的复杂化,属于调用GUI代码中的某个地方,而不是在此实用程序方法中。如果必须,可以将其重新添加。
如果选中switchLetters
,则此版本选择一个字母,如果选中switchNumbers
,则选择一个数字,确保选中至少一个所选类型。其余的角色是随机的。
因为前两个字符按特定顺序排列,所以结果会安全洗牌。这就是我使用数组来保存结果的原因,因此更容易随机播放。
我已经提出了很多意见来帮助解释事情。
final String alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
final String digits = "0123456789";
Random secRand = new SecureRandom();
String randomString(int len) {
if (len < 2) {
throw new IllegalArgumentException("randomString - length too short: " + len);
}
// Pool of characters to select from.
String pool = "";
// Array to hold random characters.
Character[] result = new Character[len];
// Index into result.
int index = 0;
if (switchLetters.isChecked()) {
// Put letters in pool.
pool = pool + alpha;
// Ensure at least one letter.
result[index] = alpha.charAt(secRand.nextInt(alpha.length()));
index++;
}
if (switchDigits.isChecked()) {
// Put digits in pool.
pool = pool + digits;
// Ensure at least one digit.
result[index] = digits.charAt(secRand.nextInt(digits.length()));
index++;
}
// Fill rest of result array from pool.
for ( ; index < len; index++) {
result[index] = pool.charAt(secRand.nextInt(pool.length()));
}
// Shuffle result array with secRand to hide ordering.
Collections.shuffle(Arrays.asList(result), secRand);
// Assemble return string.
StringBuilder sb = new StringBuilder(len);
for (Character c : result) {
sb.append(c);
}
return sb.toString();
} // end randomString()