Java 生成900万个唯一的随机数字字符串

Java 生成900万个唯一的随机数字字符串,java,random,uniqueidentifier,unique-id,Java,Random,Uniqueidentifier,Unique Id,问题1:我们能否生成8位唯一的9-1000万个纯数字字符串 问题2:如何在一次程序运行中生成900万到1000万个唯一的“仅限数字”字符串?这些密钥将上载到db,以便在未来6个月内使用。我试过了 Math.floor(Math.random() * 10000000) + 10000000; 在循环中,但会产生大量重复项。为了消除重复,我使用了HashSet,但我在线程“main”java.lang.OutOfMemoryError中得到了异常:集合中~140xxxx大小之后的java堆空间

问题1:我们能否生成8位唯一的9-1000万个纯数字字符串

问题2:如何在一次程序运行中生成900万到1000万个唯一的“仅限数字”字符串?这些密钥将上载到db,以便在未来6个月内使用。我试过了

Math.floor(Math.random() * 10000000) + 10000000; 

在循环中,但会产生大量重复项。为了消除重复,我使用了HashSet,但我在线程“main”java.lang.OutOfMemoryError中得到了异常:集合中~140xxxx大小之后的java堆空间。生成此输出的任何其他方法?

创建唯一随机数块的标准方法是首先按顺序创建数字(例如,在数组中),然后将其洗牌


在选择洗牌算法时需要小心;我听说这很好。

创建一个唯一随机数块的标准方法是首先按顺序创建数字(例如,在数组中),然后将其洗牌


在选择洗牌算法时需要小心;我听说很不错。

如果是一次性运行,只需使用命令行选项
-Xmx2048M
(2G就是一个例子)

如果是一次性运行,只需使用命令行选项
-Xmx2048M
(2G只是一个示例)

您可以将它们存储在数据库中,并在存储它们的列上放置索引(如果出现DuplicateKeyException,则使用唯一约束和重试循环)。更好的是,您可以编写一个存储过程来执行此操作,并直接对数据库进行操作。我在为URL生成短代码(可能导致重复)时使用这种方法。如果您的时间要求不严格,这是一个可行的选择。

您可以将它们存储在数据库中,并在存储它们的列上放置一个索引(如果发生DuplicateKeyException,则使用唯一约束和重试循环)。更好的是,您可以编写一个存储过程来执行此操作,并直接对数据库进行操作。我在为URL生成短代码(可能导致重复)时使用这种方法。如果您的时间要求不严格,这是一个可行的选择。

Q1。我们能否生成8位唯一的900-1000万个纯数字字符串?

是,您可以使用10位数字1,2,3,4,5,6,7,8,9,0生成10000000个8位唯一数字字符串

若你们正在为所有可能的组合编写正确的逻辑,你们将不会得到任何副本,但为了安全起见,你们可以使用set

当您获取java.lang.OutOfMemoryError错误时,这是因为您生成了那么多的数字并将其保存在内存中。解决方案是生成一小段数字并保存到数据库中,然后清除列表,再次填充下一段数字,并保持重复,直到将所有数字保存到数据库中

Q2。如何在一次程序运行中生成900万到1000万个唯一的“仅限数字”字符串?

下面是一个组合代码,您可以使用它来实现您的目标

public class Combination{
    public static int count = 0;
    public static ArrayList<String> list;

    public Combination(){
        list = new ArrayList<String>();
    }
    public static void main(String[] args){
        Combination c = new Combination();
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        int num = sc.nextInt();
        if(num>str.length()){
            System.out.println("This combination is not possible");
            System.out.println(num+" should be less than or equal to the length of the string "+str);
        }else{
            System.out.println("Processing....");
            char[] array = new char[num];
            c.fillNthCharacter(0,array,str);
            System.out.println("Total combination = "+count);
        }
    }

    public static void fillNthCharacter(int n,char[] array,String str){
        for(int i=0;i<str.length();i++){
            array[n]=str.charAt(i);
            if(n<array.length-1){
                fillNthCharacter(n+1,array,str);
            }else{
                count++;
                //System.out.println(new String(array));
                list.add(new String(array));
                if(list.size()>100000){
                    //code to add into database
                    list.clear();
                }
            }
        }
    }
}
公共类组合{
公共静态整数计数=0;
公共静态数组列表;
公共合并(){
列表=新的ArrayList();
}
公共静态void main(字符串[]args){
组合c=新组合();
扫描仪sc=新的扫描仪(System.in);
字符串str=sc.next();
int num=sc.nextInt();
如果(num>str.length()){
System.out.println(“此组合不可能”);
System.out.println(num+”应小于或等于字符串“+str”的长度);
}否则{
System.out.println(“处理…”);
char[]数组=新字符[num];
c、 fillNthCharacter(0,数组,str);
System.out.println(“总组合=”+计数);
}
}
公共静态void fillNthCharacter(int n,char[]数组,String str){

对于(int i=0;iQ1。我们能否生成8位唯一的900-1000万个纯数字字符串?

是,您可以使用10位数字1,2,3,4,5,6,7,8,9,0生成10000000个8位唯一数字字符串

若你们正在为所有可能的组合编写正确的逻辑,你们将不会得到任何副本,但为了安全起见,你们可以使用set

当您获取java.lang.OutOfMemoryError错误时,这是因为您生成了那么多的数字并将其保存在内存中。解决方法是生成一些小的数字块并将其保存到数据库中,然后清除列表,再次填充下一个数字块并保持重复,直到保存所有数字输入数据库

Q2.如何在一次程序运行中生成900万到1000万个唯一的“仅限数字”字符串?

下面是一个组合代码,您可以使用它来实现您的目标

public class Combination{
    public static int count = 0;
    public static ArrayList<String> list;

    public Combination(){
        list = new ArrayList<String>();
    }
    public static void main(String[] args){
        Combination c = new Combination();
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        int num = sc.nextInt();
        if(num>str.length()){
            System.out.println("This combination is not possible");
            System.out.println(num+" should be less than or equal to the length of the string "+str);
        }else{
            System.out.println("Processing....");
            char[] array = new char[num];
            c.fillNthCharacter(0,array,str);
            System.out.println("Total combination = "+count);
        }
    }

    public static void fillNthCharacter(int n,char[] array,String str){
        for(int i=0;i<str.length();i++){
            array[n]=str.charAt(i);
            if(n<array.length-1){
                fillNthCharacter(n+1,array,str);
            }else{
                count++;
                //System.out.println(new String(array));
                list.add(new String(array));
                if(list.size()>100000){
                    //code to add into database
                    list.clear();
                }
            }
        }
    }
}
公共类组合{
公共静态整数计数=0;
公共静态数组列表;
公共合并(){
列表=新的ArrayList();
}
公共静态void main(字符串[]args){
组合c=新组合();
扫描仪sc=新的扫描仪(System.in);
字符串str=sc.next();
int num=sc.nextInt();
如果(num>str.length()){
System.out.println(“此组合不可能”);
System.out.println(num+”应小于或等于字符串“+str”的长度);
}否则{
System.out.println(“处理…”);
char[]数组=新字符[num];
c、 fillNthCharacter(0,数组,str);
System.out.println(“总组合=”+计数);
}
}
公共静态void fillNthCharacter(int n,char[]数组,String str){

对于(int i=0;i我只是增加了vm内存大小并运行应用程序以生成900万张优惠券。感谢大家对回答这个问题感兴趣。

我只是增加了vm内存大小并运行应用程序以生成