如何在Java中生成随机字符串[重复]

Posted

技术标签:

【中文标题】如何在Java中生成随机字符串[重复]【英文标题】:How to generate a random String in Java [duplicate] 【发布时间】:2011-02-21 06:34:13 【问题描述】:

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

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

而且我必须确保没有重复的 id。

【问题讨论】:

如果我没看错你的问题,你想生成一个随机数 R 使得 1,000,000 先生成随机数再转成字符串会不会更容易? 那么,家庭作业做得怎么样了? 我猜这 3 个单行代码非常有用.. Long.toHexString(Double.doubleToLongBits(Math.random())); UUID.randomUUID().toString(); RandomStringUtils.randomAlphanumeric(16); 在有限的数据维度下如何确保唯一性?如果学生人数超过 10^7,您将无法为每个学生分配唯一编号。 【参考方案1】:

生成随机字符串很容易 - 只需使用 java.util.Random 和包含您希望可用的所有字符的字符串,例如

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);

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

【讨论】:

@chandra:是的,没错。给它一个你想从中选择的字符的字符串。因此,如果您只想要数字,您可以输入“0123456789”。如果你只想要大写字母,你可以传入 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 等。 这比使用UUID.randomUUID().toString() 更正确吗?如果是,为什么? @Is7aq:嗯,它提供了对输出的更多控制,包括使用哪些字符以及字符串的长度。 你为什么将 Random 作为参数传递? @RockOnGom:抱歉,我之前错过了这条评论。对于这样的事情,我认为Random 实际上是一个依赖项——在这里接受它允许调用者决定是否使用预置的Random 来获得可重复的结果(例如用于测试),SecureRandom 使其适合出于安全目的等。【参考方案2】:

这很好:

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RandomStringUtils.html - 类似于RandomStringUtils.randomNumeric(7)

有 10^7 个等概率(如果 java.util.Random 没有损坏)不同的值,因此唯一性可能是一个问题。

【讨论】:

http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/RandomStringUtils.html 坏了!!! 安全哈希不是为了唯一性,是为了隐藏初始值【参考方案3】:

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

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

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

【讨论】:

不过,这与“7 个数字字符的随机字符串”不同。 随机 UUID 基本上保证是唯一的。如果您需要其中的数字字符串,请对其进行哈希处理。【参考方案4】:
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);

【讨论】:

【参考方案5】:

我认为以下课程代码会对您有所帮助。它支持多线程,但您可以做一些改进,例如删除同步块并同步到 getRandomId() 方法。

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);



【讨论】:

【参考方案6】:

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

现在,如果您确实需要它是随机的,我们首先要注意生成的不包含重复的数字序列不能称为随机。 :p 现在我们已经解决了这个问题,最快的方法是使用包含所有已生成 ID 的 HashtableHashMap。每当生成新 ID 时,对照哈希表检查它,如果 ID 已经出现则重新生成。如果学生人数远少于 ID 的范围,这通常会很好地工作。如果没有,随着需要重新生成 ID 的可能性增加,您将陷入更深的麻烦,P(generate new ID) = number_of_id_already_generated / number_of_all_possible_ids。在这种情况下,请查看第一段(是否需要随机 ID?)。

希望这会有所帮助。

【讨论】:

是的,它必须是随机的,这就是我的项目规范所说的【参考方案7】:

许多可能性...

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

这取决于您需要什么、随机性级别、所涉及的安全性...但是对于学校项目,我想获得 UUID 子字符串会适合 :)

【讨论】:

是的,它只是一个学校项目,所以我不需要担心安全性和其他东西,但是 UUID 产生 32char 字符串,我只需要 7 .. 我刚刚有了一个想法,是否有可能只取 32 中的第 7 个字符? 使用子字符串...我说的是:)

以上是关于如何在Java中生成随机字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Java中生成字母数字随机字符串[重复]

在java中生成随机字符串[重复]

如何在java中生成一个随机的15位长[重复]

在 Access 中生成随机字母数字字符串后检查重复项

如何在 Java 中生成 SALT 值?

在 Python 3 中生成具有随机长度的类随机唯一字符串的最快方法