根据 Java 中的 m 字节种子生成 n 个随机字节

Generate n random bytes based on m-byte seed in Java

我想从给定的m字节种子生成n个随机字节].生成的序列必须可重现;对于相同的种子,必须生成相同的序列。 n 可以 高于 低于

我想到的以下两种琐碎的方法是有偏见的:

有标准的方法吗?我在java.security中没有看到任何相关的class,但我猜这是对密码学的基本需求?

注意:我不需要"crypto-level extra-secure"随机数,只需要通过基本统计随机性测试的随机数。此外,我更喜欢依赖标准代码,而不是必须自己编写所有代码。

Edit: java.security.SecureRandom(byte[] seed) 不符合要求,生成的序列是纯随机的并且不仅仅依赖于种子(至少在我的 JVM 上是这样,但是我想要一个可预测的结果)。

郑重声明,上面讨论的(相当慢的)解决方案:

    public byte[] rand(byte[] seed, int n) {
        try {
            byte[] data = null;
            ByteArrayOutputStream ret = new ByteArrayOutputStream(n);
            while (ret.size() < n) {
                MessageDigest md = MessageDigest.getInstance("SHA1");
                md.update(seed);
                if (data != null)
                    md.update(data);
                data = md.digest();
                ret.write(data, 0, Math.min(n - ret.size(), data.length));
            }
            return ret.toByteArray();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

这会在 ~500 毫秒内生成 1M "random" 字节,并通过非常基本的统计随机性测试。也许选择比 SHA1 更快的散列会加快速度,没有调查。