当前位置: 首页 > 知识库问答 >
问题:

如何在Java中创建随机安全代码数组?[副本]

姬昀
2023-03-14

原始关闭原因未解决

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

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

该方法应通过随机选择字符,即数字和字母,以上述格式创建安全代码。

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

"2394QAB""2821TSZ""7173AAY""2236WQA"

我只能使用在我的课程中学习的代码的方法,而不能使用像regex这样的其他库,这就是为什么我要这样尝试。

这是我迄今为止所做的代码:

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个随机字母,并将它们相加成一个字符串来制作代码。但是,代码不会生成随机代码,我不知道如何从这里继续。

共有3个答案

赵元白
2023-03-14

另一种方法是为此使用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);
容远
2023-03-14

为了简化生成密码的代码,可以使用org中的RandomStringUtils。阿帕奇。平民lang3.RandomStringUtils,如本教程所述https://www.baeldung.com/java-random-string.您只需生成2个字符串:一个是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();
    }
常心水
2023-03-14

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

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

在实用方法中,可以声明一个随机对象来获取随机int值。然后,使用第一个for循环,您可以生成包含0到排除10之间的随机值,并将它们附加到StringBuilder对象。类表示不可变的对象,因此需要使用StringBuilder来构建一个对象。如上所述,使用操作符链接字符串将在每次连接时创建新实例,而不是处理同一个对象。

然后,使用第二个for循环,您可以生成从0到27的随机值,将偏移量65添加到每个值,表示大写字母“a”(小写字母“a”的值为97),然后将此int值转换为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();
    }
}
 类似资料:
  • 问题内容: 使用标准JDK在Java中生成安全的随机AES密钥的推荐方法是什么? 在其他帖子中,我发现了这一点,但是使用a 可能是一个更好的主意: 如果答案中包含对为什么这是生成随机密钥的一种好方法的解释,那将是很好的。谢谢! 问题答案: 我将使用您建议的代码,但略作简化: 让提供者选择计划如何获得随机性-不要定义可能不如提供者已经选择的东西更好的东西。 该代码示例假定(如Maarten所指出的那

  • 问题内容: 我正在用python创建一个项目,我想创建一个加密安全的随机数,我该怎么做?我已经在线阅读了常规随机生成器生成的数字不是密码安全的信息,并且该函数返回的是我的字符串,而不是数字。 问题答案: 您可以通过将函数应用于所返回的字节来获取随机数列表,如下所示 报价文件, 返回 适合加密使用* 的随机字节字符串。 * 该函数从特定于操作系统的随机性源返回随机字节。尽管返回的数据的确切质量取决于

  • 问题内容: 这个问题:如何生成随机BigInteger描述了一种与BigIntegers实现与Random.nextInt(int n)相同的语义的方法。 我想对BigDecimal和Random.nextDouble()做同样的事情。 上述问题的一个答案建议创建一个随机的BigInteger,然后从中以随机的比例创建一个BigDouble。一个非常快速的实验表明这是一个非常糟糕的主意:) 我的直

  • 问题内容: 我想在Java中创建一个通用数组,以维护通常由Java提供的类型安全。 我正在使用此代码: 此代码类型安全吗?如果是这样,为什么?为什么它是类型安全的,我需要强制转换? 问题答案: 该方法的返回类型为。因此,您不能将其直接分配给以外的任何其他对象。因此,您需要演员表。 该方法委托给一个方法 创建具有指定组件类型和长度的新数组 因此,它正在创建一个type数组。 类型安全性,假设声明为

  • 如何修改上面的代码,这样如果我输入100,我就有一个100个数字的数组,没有重复? 谢谢你。

  • 问题内容: 我正在编写一个从整数n创建2D数组的程序。然后,我必须用从1到n n数组大小的 值填充数组, 并检查它是否是一个幻方。 我现在的方式是按照从1到n n数组大小的 顺序填充 数组。我该如何随机? 我的代码: 问题答案: 创建一个随机的数字列表以添加到您的数组中,如下所示: