我需要在Java中生成10,000个唯一标识符。标识符应该是数字和字母的混合,每个少于10个字符。有任何想法吗?内置的图书馆将是一个额外的加分。
答案 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)
缺点:它有点慢。