11月一直在准备考试和各种结课作业,停滞了很长时间没有学习新技术了。最近在stackoverflow上看到一些有趣的问题,就自己做了相关总结。

https://stackoverflow.com/questions/41107/how-to-generate-a-random-alpha-numeric-string

问题:生成伪随机的字母-数字字符串。For example, a generated string of length 12 might look something like "AEYGF7K0DM1X".

类的逻辑较为简单,不过使用了一些之前没接触过的库函数。

1、java.util.concurrent.ThreadLocalRandom

Random虽然是线程安全的,但是在多线程环境下效率很低,而且Random产生的随机数序列可以预测,顾不适合作为验证码类随机数产生。(思考:图片验证码产生是不是根据产生的随机数从数据库中选出相应的图片作为验证码?)

System.out.println("-----------产生1到10之间的随机数----------------");
// 返回当前线程的 ThreadLocalRandom
// 每个线程都有一个独立的生成器
ThreadLocalRandom threadRandom = ThreadLocalRandom.current();
System.out.println(threadRandom.nextInt(10));
System.out.println("-----------产生两个数之间的随机数----------------");
System.out.println(threadRandom.nextInt(10,100));

2、Random类默认使用当前系统时钟作为种子,种子相同生成的随机数序列也相同,所以不安全。操作系统收集了一些随机事件,比如鼠标点击,键盘点击等等,SecureRandom 使用这些随机事件作为种子。安全性很高。具体原理感兴趣可以研究。

import java.security.SecureRandom;
import java.util.Locale;
import java.util.Objects;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class RandomString {

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

    public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    // Local.ROOT 获取系统的语言环境
    public static final String lower = upper.toLowerCase(Locale.ROOT);

    public static final String digits = "0123456789";

    public static final String alphanum = upper + lower + digits;

    private final Random random;

    private final char[] symbols;

    private final char[] buf;

    // length 生成随机字符串长度
    // symbols 用于生成随机字符串的字符列表
    public RandomString(int length, Random random, String symbols) {
        if (length < 1) throw new IllegalArgumentException();
        if (symbols.length() < 2) throw new IllegalArgumentException();
        this.random = Objects.requireNonNull(random);
        this.symbols = symbols.toCharArray();
        this.buf = new char[length];
    }

    /**
     * Create an alphanumeric string generator.
     */
    public RandomString(int length, Random random) {
        //该this方法是调用上面的RandomString构造方法
        this(length, random, alphanum);
    }

    /**
     * Create an alphanumeric strings from a secure generator.
     */
    public RandomString(int length) {
        this(length, new SecureRandom());
    }

    /**
     * Create session identifiers.
     */
    public RandomString() {
        this(21);
    }

}

补充:java提供了一个生成随机文件名的包(java.util.UUID),主要用于web中产生的一些文件。

import java.util.UUID;

public class randomStringGenerator {
    public static void main(String[] args) {
        System.out.println(generateString());
    }

    public static String generateString() {
        String uuid = UUID.randomUUID().toString();
        return "uuid = " + uuid;
    }
}


StackOverflow      JAVA随笔

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!