效率好,10万个只需要15毫秒左右,支持跳数生成
可用该方法生成34进制,26进制等数
跳数为0时为顺序生成,
跳数为1时,则跳过一个再生成,如frontMac为00:00:00:00:00:01 ,skipNum = 1,则生成的mac为00:00:00:00:00:03
/**
* 自行去掉日志打印会更快
* @param startMac 开始的mac
* @param skipNum 跳数
* @param howMany 生成多少个
*/
private static void generateMacs(String startMac,int skipNum,int howMany){
long startTime = System.currentTimeMillis();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(startMac).append("\n");
String newMac ;
String oldMac = startMac;
for(int i = 0; i< howMany; i++){
newMac = generateMacsAddress(oldMac,skipNum);
stringBuilder.append(newMac).append("\n");
oldMac = newMac;
}
long usedTime = System.currentTimeMillis() - startTime;
System.out.println(stringBuilder);
System.out.println("用时 : "+usedTime + " ms");
}
代码分开写时因为下面的方法其他地方也可以用到(例如每增加一个mac,就去读U盘的文件),分开写可以物尽其用
/**
* mac生成器
* @param frontMac 前置mac,根据前置mac生成下一个mac地址
* @param skipNum 跳数,每跳几个mac生成,跳数为0时为顺序生成,
* 跳数为1时,则跳过一个再生成,如frontMac为00:00:00:00:00:01 ,skipNum = 1,则生成的mac为00:00:00:00:00:03
*/
private static String generateMacsAddress(String frontMac,int skipNum){
char[] arr = frontMac.toCharArray();
char[] letters = new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int remainder = skipNum + 1;
for(int m = arr.length-1; m>=0; m--){
if(arr[m] == ':') continue;
int index = getArrIndex(arr[m],letters);
index = index + remainder;
if(index >= letters.length){
remainder = index / letters.length;
index = index % letters.length;
arr[m] = letters[index];
}else{
arr[m] = letters[index];
break;
}
}
return String.valueOf(arr);
}
private static int getArrIndex(char ch,char[] letters){
int i = 0;
for (char let:letters) {
if(let == ch)
return i;
i++;
}
return 0;
}