Java:随机生成不同的名称

时间:2011-02-17 06:12:41

标签: java random unique

我需要在Java中生成10,000个唯一标识符。标识符应该是数字和字母的混合,每个少于10个字符。有任何想法吗?内置的图书馆将是一个额外的加分。

8 个答案:

答案 0 :(得分:24)

我很晚才回答这个问题,但这对新读者来说真的很有用。 这是获取 随机VALID名称 的一种非常简单有效的方法。 为此,请在POM.xml中添加maven存储库

<dependency>
    <groupId>com.github.javafaker</groupId>
    <artifactId>javafaker</artifactId>
    <version>0.12</version>
</dependency>

然后在Java代码中使用Faker类,如下所示

Faker faker = new Faker();

String name = faker.name().fullName();
String firstName = faker.name().firstName();
String lastName = faker.name().lastName();

String streetAddress = faker.address().streetAddress();

尝试使用标准System.out.println();

打印结果

有关详情,请参阅Faker Lib

答案 1 :(得分:16)

// class variable
final String lexicon = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12345674890";

final java.util.Random rand = new java.util.Random();

// consider using a Map<String,Boolean> to say whether the identifier is being used or not 
final Set<String> identifiers = new HashSet<String>();

public String randomIdentifier() {
    StringBuilder builder = new StringBuilder();
    while(builder.toString().length() == 0) {
        int length = rand.nextInt(5)+5;
        for(int i = 0; i < length; i++) {
            builder.append(lexicon.charAt(rand.nextInt(lexicon.length())));
        }
        if(identifiers.contains(builder.toString())) {
            builder = new StringBuilder();
        }
    }
    return builder.toString();
}

答案 2 :(得分:8)

为什么不使用java.util.UUID? 它保证生成唯一标识符,它是标准的: - )。

答案 3 :(得分:2)

如果你允许Apache Commons lang ......

public String[] getRandomlyNames(final int characterLength, final int generateSize) {
    HashSet<String> list = new HashSet<String>();
    for (int i = 0; i < generateSize; ++i) {
        String name = null;
        do {
            name = org.apache.commons.lang.RandomStringUtils.randomAlphanumeric(
                    org.apache.commons.lang.math.RandomUtils.nextInt(characterLength - 1) + 1);
        while(list.contains(name));
        list.add(name);
    }
    return list.toArray(new String[]{});
}

答案 4 :(得分:1)

您可以尝试使用当前时间的md5哈希值,您将获得“随机”标识符作为数字和字母的混合

答案 5 :(得分:1)

最简单快捷的方法是生成某个字符串的permutations。只要字符串足够长,您就可以轻松拥有10,000个唯一排列。产生排列的好处是你不必担心重复。如果一个字符串包含所有不同的字符,它可以生成n!排列(n是字符串的长度)。因此,包含8个不同字符的字符串可以生成40,320种不同的排列。

有许多代码可以在线生成字符串的排列,例如这个http://introcs.cs.princeton.edu/23recursion/Permutations.java.html

如果您希望它们更随机,您可以使用不同的字符串作为种子,例如“abcde123”,“efgh456”等。

答案 6 :(得分:1)

你可以尝试

Random rand = new Random();
Set<String> words = new HashSet<String>();
while(words.size() < 10000) 
    words.add(Long.toString(Math.abs(rand.nextLong() % 3656158440062976L), 36)));

长常数足以容纳10位数,基数为36的数字。

答案 7 :(得分:0)

我有同样的问题,但我需要一个任意长的字符串。我想出了这个单线程,不需要外部库,这将给你10个字符:

BigInteger.probablePrime(50, new Random()).toString(Character.MAX_RADIX)

长度可以更改,每个字符大约需要5位。什么是过滤和限制长度如下(只是小写字母,大小10):

BigInteger.probablePrime(100, new Random()).
    toString(Character.MAX_RADIX).
    replaceAll("[0-9]", "").
    substring(0, 10) 

缺点:它有点慢。