Java如何⽣成千万级别的不重复的⼋位数
Java⽣成千万个的⼋位数
当⼤佬给我这个需求的时候我的⼼⾥是有点⼩确幸啊,这还不简单吗,⽤Java的Math.random就可以⽣成随机数了,⽹上⼀⼤堆的博⽂,还有些是uuid⽣成字母家数字的,⽽且这种⽅法⽣成时间需要10秒以上,还有⼀点⽣成⼀千万的时候有重复出现的,这种⽅法绝壁不⾏,上代码:
public class Poiread {
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
List<String> list=new ArrayList<String>();
for(int i=0;i<10000000;i++){
String RandomNum();
list.add(str);
}
long starttime=System.currentTimeMillis();
System.out.println("去重前的⼤⼩"+list.size());
List<String> newlist=new ArrayList<String>(new HashSet<String>(list));
System.out.println("去后⼤⼩"+newlist.size());
long endtime=System.currentTimeMillis();
System.out.println(endtime-starttime);
}
public static String genRandomNum(){
int  maxNum = 36;
int i;
int count = 0;
char[] str = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
StringBuffer sb = new StringBuffer("");
Random r = new Random();
while(count < 8){
i = Math.Int(maxNum));
if (i >= 0 && i < str.length) {
sb.append(str[i]);
count ++;
}
}
String();
}
}
结果是这样的:
⼀千万8位数的时候有10多个重复的,需求是⼀个都不⾏,⽽且⽣成的时间是12秒钟(对于程序来说过来过了⼏个世纪啊),这咋整,后来就想着⽤递增的⽅法⽣成,8位数的第⼀位是字母开头的,A1000000,⼀直递增到A9999999 ,再换成这样⼀直循环,到Z9999999,我算了⼀下这样可以⽣成89999999个不同的⼋位数,⽽且不会有重复的(机智如我)
再上⼀波代码:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class CreateNumber extends Thread{
public static void main(String[] args) {
CreateNumber c=new CreateNumber();
c.start();
CreateNumber c1=new CreateNumber();
c1.start();
java生成随机数的方法
}
@Override
public void run() {
// TODO Auto-generated method stub
long startlong=System.currentTimeMillis();
List<String> list=getNumbet(1000);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long endlong=System.currentTimeMillis();
System.out.println(endlong-startlong);
System.out.println("去重前listsize"+list.size());
System.out.String());
}
public static List<String> getNumbet(int loopNumber){
List<String> list=new ArrayList<String>();
String[] ch = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
"L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W",
"X", "Y", "Z"};
int number=1000000;
int c=0;
String sb=null;
for(int i=0;i<loopNumber;i++){
sb=ch[c]+number;
if(sb.length()>9){//如果字母后⾯满了,就换下⼀个字母组合,再把字母后⾯的值全部归零
c++;
number=1000000;
}
list.add(ch[c]+number);
number++;
}
return list;
}
}
结果是这样的:
只⽤10多毫秒,完美!那么问题来了,⾜⾜有8千多万不重复的⼋位数!那么问题来了,有些盆友要问,超过了8千万呢,那要保证不不重复,我的想法是再8位数的第⼆位再加字母,AB100000  ----- AB999999 然后AC1000000 ------AC100000 ,就这样我都懒的算这可以⽣成多少位不重复的⼋位数的,如果是⽣成32wei位的随机数,UUID⽣成的上亿都是⼏率很⼩的,当然我的需求是这样的。有想法的
⼩伙伴欢迎吐槽!