java - 如何在 Java 中创建一个随机安全码数组?

我正在尝试编写一个程序,询问用户他想要生成多少个安全代码,然后它将输出他在数组中请求的代码。

安全码长度应为 7 个字符,格式如下:NNNNLLL,其中 N 是随机数,L 是随机大写字母。

该方法应通过随机选择字符(即数字和字母)来创建具有上述格式的安全代码。

如果用户选择生成 4 个代码,我希望程序输出如下内容:

“2394QAB” “2821TSZ” “7173AAY” “2236WQA”

我只能使用在我的课程中学到的代码的方法,我不能使用其他库,比如正则表达式,这就是我这样尝试的原因。

这是我到目前为止所做的代码:

import java.util.Random;
public class ItemChecker{

    private StringBuffer strBuff;
    private String[] codes;
    private String CodeLetters, CodeNumbers;
    private int[] RandomNums;

    public ItemChecker(){
            strBuff=new StringBuffer();
    }

    public String[] getCodes(int[] amount){
        codes=new String[amount.length];
        for(int i=0;i<amount.length;i++)
            {
            CodeLetters="";
            strBuff=new StringBuffer();
                for(int j=0;j<4;j++)
                    {
                        Random RandomNumber=new Random();
                        int randomIndex=RandomNumber.nextInt(RandomNums.length);

                        CodeNumbers.append(RandomNumber[randomIndex]);
                    }
                for(int j=0;j<3;j++)
                    {
                        Random RandomLetter=new Random();
                        char c =(char)(RandomLetter.nextInt(26)+'a');
                        CodeLetters+=c;
                    }
            codes[i]=CodeNumbers+CodeLetters;
        }
    }


}

我的意图是创建 4 个随机数字和 3 个随机字母并将它们添加到 string 中以生成代码。但是,代码不会生成随机代码,我不知道如何从这里开始。

回答1

在您的 getCodes 方法中有几个错误。 StringBuiler 更适合此任务,而不是使用 StringBuffer 或将 strings 与 + 运算符链接。事实上,每次您使用 + 运算符执行连接时,您都是在内存中创建一个新的 string,而不是在同一个实例上工作,这不是那么有效。此外,当您向代表大写字母的随机 value 添加偏移量时,您添加的是小写字母“a”,而不是大写字母“A”。

在您的程序中,您可以定义一个静态方法来提供代码生成服务作为通用实用程序,然后在您的 getCodes 方法中调用它。

在实用程序方法中,您可以声明一个 Random 对象以获取随机 int values。然后,通过第一个 for 循环,您可以生成包含 0 和排除 10 之间的随机 values,并将它们附加到 StringBuilder 对象。 String 类表示 不可变 对象,因此您需要使用 StringBuilder 来构建一个。如上所述,将 strings 与 + 运算符链接将在每个连接处创建新实例,您不是在处理同一个对象。

然后,使用第二个 for 循环,您可以生成从 0 到 27 的随机 values 排除,添加到每个 value 偏移量 65,代表大写“A”字母(小写“a”有 value 97),然后将此 int value 转换为 char 以获取其字符表示。最后,将 char 附加到您的 StringBuilder 实例中。

这是一个实现:

public class Main {
    public static void main(String[] args) {
        System.out.println(getSecurityCode());
    }

    public String[] getCodes(int[] amount) {
        String[] codes = new String[amount.length];
        for (int i = 0; i < codes.length; i++) {
            codes[i] = getSecurityCode();
        }
        return codes;
    }

    public static String getSecurityCode() {
        Random rand = new Random();
        StringBuilder strBuilder = new StringBuilder();

        //Appending 4 random digits
        for (int i = 0; i < 4; i++) {
            //nextInt(10) returns a value between 0 (included) and 10 (excluded)
            strBuilder.append(rand.nextInt(10));
        }

        //Appending 3 random upper case letters
        for (int i = 0; i < 3; i++) {
            //rand.nextInt(27) returns a random value between 0 and 26 included to represent an alphabet letter.
            //This value is added with the offset 65 which represents the upper case A letter.
            //Finally, this value is cast as a char or else it would append its int value
            strBuilder.append((char)(65 + rand.nextInt(27)));
        }

        return strBuilder.toString();
    }
}

回答2

为了简化生成密码的代码,您可以使用来自 org.apache.commons.lang3.RandomStringUtils 的 RandomStringUtils,如本教程 https://www.baeldung.com/java-random-string。您只需要生成 2 个 strings :一个有 4 个数字 一个有 3 个大写字母

并连接两者。

就是这样

public static String getSecurityCode() {
    //generate 4 numbers only
     String generatedNumbers = RandomStringUtils.random(4, false, true);
    //generate 3 letters only
     String generatedLetters = RandomStringUtils.random(3, true, false).toUpperCase();
     
     return generatedNumbers + generatedLetters;
}

或使用 StringBuilder

public static String getSecurityCode2() {
        StringBuilder stb=new StringBuilder(7);
        //generate 4 numbers only
        stb.append(RandomStringUtils.random(4, false, true));
        //generate 3 letters only
        stb.append( RandomStringUtils.random(3, true, false).toUpperCase());
         
         return stb.toString();
    }

回答3

另一种方法是利用 StringBuilder 的 appendCodePoint 方法:

int number= random.nextInt(10000);  //generate any number between 0 to 9999
StringBuilder builder=new StringBuilder();
for(int i=0;i<3;i++) {
            builder.appendCodePoint(65+random.nextInt(26));
}
String result=number+builder.toString();
System.out.println(result);

相似文章

随机推荐

最新文章