Java:RandomStringUtils随机种子

3

我一直在使用RandomStringUtils来生成随机ID,用作数据库键:

import org.apache.commons.lang.RandomStringUtils;
public class RandomStringTest {
    public static void main(final String[] args) {
        for (int i = 0; i <= 10; i++) {
            final String id = RandomStringUtils.random(8,
                    "0123456789abcdefghijklmnopqrstuvwxyz");
            System.out.println(id);
        }
    }
}

关键空间足够大,
len("0123456789abcdefghijklmnopqrstuvwxyz")^8 = 282110990745610^12

随机机制是否已经正常启动?在将其应用到生产环境之前,我需要了解密钥是否被正确分配。

顺便说一下,测试代码在执行几次时没有重复出现,但这远非坚实的证明。

2个回答

5

在该实现中没有提供种子(我找到了),只有一个new Random()。但是有一个方法,您可以自己提供随机数源。

random(int count, int start, int end, 
        boolean letters, boolean numbers, 
        char[] chars, java.util.Random random)

1
对于想生成难以预测的字符串的任何人,可以传入一个 java.security.SecureRandom - Chris Kentfield
“默认”的随机源是什么?这个源与其他“Random”实用程序共享吗?我明确传递的Random实例是否会被进一步调用RandomStringUtils.*使用?这个模块的文档太糟糕了 :-( - jameshfisher
如果您没有传递随机数,则使用静态的 new Random();。所有其他方法最终似乎都会使用答案中的方法,使用静态随机数。如果您传递自己的随机数,则不会存储该随机数,因此不会在后续调用中使用。此包中还有一个“随机”实用程序(RandomUtils),它们不共享代码。 - Joost

0
你不应该使用随机生成器来生成唯一键。没有东西可以保证唯一性。为什么不使用UUID生成器或数据库序列呢?
而且,为什么你希望你的键被适当地分布?主键唯一性是唯一重要的事情。据我所知,种子对分布没有任何影响。

同意。我必须处理遗留的限制。 - Adam Matan
这里没有任何阻止两次分配相同id的东西。 - Chad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接