java – 如何生成一个随机的字母数字字符串?

我一直在寻找一个简单的Java算法来生成伪随机字母数字字符串。在我的情况下,它将被用作一个独特的会话/密钥标识符,“可能”是独特的超过500K代(我的需求不真的需要更复杂)。理想情况下,我可以根据我的唯一性需要指定长度。例如,生成的长度为12的字符串可能看起来像“AEYGF7K0DM1X”。
最佳答案
这里是安全,容易,但一点点更贵的会话标识符的代码。

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);
  }
}

这通过从密码安全的随机比特生成器选择130比特并且在base-32中对它们进行编码来工作。 128位被认为是加密强的,但是基数32中的每个数字可以编码5位,因此128被舍入到下一个5的倍数。这种编码是紧凑和有效的,每个字符具有5个随机位。将此与随机UUID进行比较,在标准布局中每个字符只有3.4位,总共只有122个随机位。

如果允许会话标识符容易猜测(太短,有缺陷的随机数生成器等),攻击者可以劫持其他人的会话。注意,SecureRandom对象初始化起来很昂贵,所以你想保留一个并重用它。

这里是便宜,不安全的随机字母数字字符串的替代代码。如果要使用更多字符,可以调整“符号”。

public class RandomString {

  private static final char[] symbols;

  static {
    StringBuilder tmp = new StringBuilder();
    for (char ch = '0'; ch <= '9'; ++ch)
      tmp.append(ch);
    for (char ch = 'a'; ch <= 'z'; ++ch)
      tmp.append(ch);
    symbols = tmp.toString().toCharArray();
  }   

  private final Random random = new Random();

  private final char[] buf;

  public RandomString(int length) {
    if (length < 1)
      throw new IllegalArgumentException("length < 1: " + length);
    buf = new char[length];
  }

  public String nextString() {
    for (int idx = 0; idx < buf.length; ++idx) 
      buf[idx] = symbols[random.nextInt(symbols.length)];
    return new String(buf);
  }
}

转载注明原文:java – 如何生成一个随机的字母数字字符串? - 代码日志