如何生成随机字母和数字字符串

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()