【问题标题】:How to generate a random string of 20 characters [duplicate]如何生成20个字符的随机字符串[重复]
【发布时间】:2011-08-06 16:49:36
【问题描述】:

可能重复:
How to generate a random String in Java

我想在不使用 apache 类的情况下生成 20 个字符的随机字符串。我真的不在乎是否是字母数字。另外,我稍后会将其转换为字节数组。

谢谢,

【问题讨论】:

  • 好的。那么你已经尝试了什么?
  • 一行:UUID.randomUUID().toString().replace("-","").substring(0,20)
  • 我猜这 3 个单行代码非常有用.. Long.toHexString(Double.doubleToLongBits(Math.random())); UUID.randomUUID().toString(); RandomStringUtils.randomAlphanumeric(20);

标签: java


【解决方案1】:

给你。只需在第一行指定要允许的字符即可。

char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray();
StringBuilder sb = new StringBuilder(20);
Random random = new Random();
for (int i = 0; i < 20; i++) {
    char c = chars[random.nextInt(chars.length)];
    sb.append(c);
}
String output = sb.toString();
System.out.println(output);

如果您使用它来生成密码等敏感信息 重置 URL 或会话 ID cookie 或临时密码重置,请务必使用 java.security.SecureRandom 代替。 java.util.Randomjava.util.concurrent.ThreadLocalRandom 产生的值在数学上是可预测的。

【讨论】:

  • 这不是一个好方法...我尝试获得一百个随机号码。但很少有是独一无二的。我把这段代码放在一个while循环中,从0迭代到99。重复了很多输出..
  • @Nikhil 我怀疑你做错了什么。如果您需要更好的随机数来源,请改用SecureRandom。不过,在这种情况下,这对重复并不重要,循环上面的代码我得到了这 100 个唯一的字符串:pastebin.com/ELZ950tk
  • @WhiteFang34 嗨,我在 MIDlet 中尝试了这段代码。我认为这可能在桌面 java 应用程序上运行良好。你可以在这里查看我的结果:pastebin.com/yDcT41g8。因此,当您在 MIDlet 中使用它时,您会得到重复的字符串。我所做的唯一更改是使用 StringBuffer 而不是 StringBuilder。
  • @WhiteFang34 好的..刚刚在一个普通的 java 类中检查了它......是的,我得到了 100 个唯一的字符串......所以这可能在 midlet 中效果不佳,因为随机类很可能不是这样强大的......或类似的东西......
  • @WhiteFang34 是的..顺利。我将随机对象放在循环之外,现在结果很完美。 100 个随机数是我得到的。 :) 白方是一本好书;)..我推荐狂野的呼唤..以防万一你还没有读过它..
【解决方案2】:

我会使用这种方法:

String randomString(final int length) {
    Random r = new Random(); // perhaps make it a class variable so you don't make a new one every time
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < length; i++) {
        char c = (char)(r.nextInt((int)(Character.MAX_VALUE)));
        sb.append(c);
    }
    return sb.toString();
}

如果你想要一个字节[],你可以这样做:

byte[] randomByteString(final int length) {
    Random r = new Random();
    byte[] result = new byte[length];
    for(int i = 0; i < length; i++) {
        result[i] = r.nextByte();
    }
    return result;
}

或者你可以这样做

byte[] randomByteString(final int length) {
    Random r = new Random();
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < length; i++) {
        char c = (char)(r.nextInt((int)(Character.MAX_VALUE)));
        sb.append(c);
    }
    return sb.toString().getBytes();
}

【讨论】:

    【解决方案3】:

    你可以使用类 java.util.Random 和方法

    char c = (char)(rnd.nextInt(128-32))+32 
    

    20x 以获取字节,您将其解释为 ASCII。如果你对 ASCII 没问题。

    32 是偏移量,通常可以打印字符。

    【讨论】:

      【解决方案4】:
      public String randomString(String chars, int length) {
        Random rand = new Random();
        StringBuilder buf = new StringBuilder();
        for (int i=0; i<length; i++) {
          buf.append(chars.charAt(rand.nextInt(chars.length())));
        }
        return buf.toString();
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-07
        • 1970-01-01
        • 2018-01-06
        • 2015-08-16
        • 2014-02-05
        • 2011-07-23
        • 2014-02-09
        相关资源
        最近更新 更多