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

时间:2017-02-08 10:41:59

标签: android random alphanumeric

我想生成字母和数字随机密码,我有两个开关,一个用于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();
}

3 个答案:

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