如何生成随机字母和数字字符串
How to generate random alpha and numeric string
我想生成字母和数字随机密码,我有两个开关,一个用于字母,一个用于数字,当两个开关都打开时,也会生成字母和数字字符串,但当我的密码长度为 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();
}
Here 是使用 SecureRandom
生成安全随机字母和数字字符串的好例子
进口java.security.SecureRandom;
导入 java.math.BigInteger;
public final class SessionIdentifierGenerator {
private SecureRandom random = new SecureRandom();
public String nextSessionId() {
return new BigInteger(130, random).toString(32);
}
}
Here 是如何生成具有自定义长度的字符串的示例。
试试下面的代码:
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;
}
你从不区分字母和数字的情况下将字母池传递给 select。如果你想确保两者都包括在内,那么你需要将它们分开更长的时间。
TextView
参数是一种不必要的复杂化,属于调用 GUI 代码中的某处,而不是此实用程序方法中。如果需要,您可以将其重新添加。
此版本在选中 switchLetters
时选择一个字母,如果选中 switchNumbers
则选择一个数字,确保每个 selected 类型中至少有一个被选中。其余字符随机。
因为前两个字符是按特定顺序排列的,所以结果是安全洗牌的。这就是为什么我用一个数组来保存结果,这样更容易洗牌。
我已经发表了很多评论来帮助解释事情。
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()
我想生成字母和数字随机密码,我有两个开关,一个用于字母,一个用于数字,当两个开关都打开时,也会生成字母和数字字符串,但当我的密码长度为 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();
}
Here 是使用 SecureRandom
生成安全随机字母和数字字符串的好例子进口java.security.SecureRandom; 导入 java.math.BigInteger;
public final class SessionIdentifierGenerator {
private SecureRandom random = new SecureRandom();
public String nextSessionId() {
return new BigInteger(130, random).toString(32);
}
}
Here 是如何生成具有自定义长度的字符串的示例。
试试下面的代码:
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;
}
你从不区分字母和数字的情况下将字母池传递给 select。如果你想确保两者都包括在内,那么你需要将它们分开更长的时间。
TextView
参数是一种不必要的复杂化,属于调用 GUI 代码中的某处,而不是此实用程序方法中。如果需要,您可以将其重新添加。
此版本在选中 switchLetters
时选择一个字母,如果选中 switchNumbers
则选择一个数字,确保每个 selected 类型中至少有一个被选中。其余字符随机。
因为前两个字符是按特定顺序排列的,所以结果是安全洗牌的。这就是为什么我用一个数组来保存结果,这样更容易洗牌。
我已经发表了很多评论来帮助解释事情。
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()