如何在Java中生成随机字符串

How to generate a random String in Java

本问题已经有最佳答案,请猛点这里访问。

我有一个对象叫Student,它有studentNamestudentIdstudentAddress等,对于studentId我必须生成由七个数字字符组成的随机字符串,如。

1
2
studentId = getRandomId();
studentId ="1234567" <-- from the random generator.

我要确保没有重复的身份证。


生成一个随机的字符串很容易——只需使用java.util.Random和一个包含所有您想要的字符的字符串,例如。

1
2
3
4
5
6
7
8
9
public static String generateString(Random rng, String characters, int length)
{
    char[] text = new char[length];
    for (int i = 0; i < length; i++)
    {
        text[i] = characters.charAt(rng.nextInt(characters.length()));
    }
    return new String(text);
}

现在,为了唯一性,您需要将生成的字符串存储在某个地方。如何做到这一点将真正取决于应用程序的其余部分。


这很好:

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/randomstringutils.html

如果您想要唯一性(很有可能),请考虑使用MD5或SHA哈希。


还可以使用java.util包中的uuid类,该包返回32位字符串的随机uuid。

java.util.UUID.randomUUID().toString()

http://java.sun.com/j2se/1.5.0/docs/api/java/util/uuid.html


1
2
3
4
5
6
7
8
9
10
11
Random ran = new Random();
int top = 3;
char data = ' ';
String dat ="";

for (int i=0; i<=top; i++) {
  data = (char)(ran.nextInt(25)+97);
  dat = data + dat;
}

System.out.println(dat);

我想下面的课程代码会对你有所帮助。它支持多线程处理,但是您可以做一些改进,比如删除同步块和同步到getRandom()方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class RandomNumberGenerator {

private static final Set<String> generatedNumbers = new HashSet<String>();

public RandomNumberGenerator() {
}

public static void main(String[] args) {
    final int maxLength = 7;
    final int maxTry = 10;

    for (int i = 0; i < 10; i++) {
        System.out.println(i +". studentId=" + RandomNumberGenerator.getRandomId(maxLength, maxTry));
    }
}

public static String getRandomId(final int maxLength, final int maxTry) {
    final Random random = new Random(System.nanoTime());
    final int max = (int) Math.pow(10, maxLength);
    final int maxMin = (int) Math.pow(10, maxLength-1);
    int i = 0;
    boolean unique = false;
    int randomId = -1;
    while (i < maxTry) {
        randomId = random.nextInt(max - maxMin - 1) + maxMin;

        synchronized (generatedNumbers) {
            if (generatedNumbers.contains(randomId) == false) {
                unique = true;
                break;
            }
        }
        i++;
    }
    if (unique == false) {
        throw new RuntimeException("Cannot generate unique id!");
    }

    synchronized (generatedNumbers) {
        generatedNumbers.add(String.valueOf(randomId));
    }

    return String.valueOf(randomId);
}

}

很多可能性…

你知道如何随机生成一个整数吗?因此,您可以从中生成一个字符…(EX 65~A)

这取决于你需要什么,随机性的程度,涉及的安全性…但是对于一个学校项目,我想得到UUID子字符串是合适的:)


你需要问的第一个问题是你是否真的需要ID是随机的。有时,顺序ID就足够了。

现在,如果您确实需要它是随机的,我们首先注意一个生成的不包含重复项的数字序列不能称为随机的。:p既然我们已经排除了这一点,那么最快的方法就是让一个HashtableHashMap包含已经生成的所有ID。每当生成新的ID时,请对照哈希表检查它,如果该ID已经出现,则重新生成。如果学生数量远小于ID的范围,这通常会很好地工作。如果没有,那么当需要重新生成一个ID的概率增加时,你就陷入了更深的麻烦中,p(生成新的ID)=number_of_id_already_generated/number_of_all_possible_id。在这种情况下,请检查第一段(您是否需要ID是随机的?).

希望这有帮助。