package com.ccytsoft.wkc.util; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 生成隨機碼 * <P> * 獲取大寫字母,小寫字母和數字的任意組合的隨機碼 * * @author kuangxiang(kuangxiang666@yeah.net) * @Date 15:20 2017/12/13 */ public class AlgorithmUtil { /** *獲取隨機編碼 * <P> * 獲取大寫字母,小寫字母和數字的任意組合的隨機碼 * * @param length 要生成字符串的長度 * @param isPureDigits 生成的隨機碼是否是純數字 true:表示存數字,false:表示純字母,null:表示字母和數字均可 * @param isUpperCase 生成的隨機碼是否大寫 如果isPureDigits的值不為true時,此值有效 true:表示大寫,false:表示小寫,null:表示大小寫都可以 * @param isTogether 字母和數字是否必須同時存在 isPureDigits的值為null時,此值有效 true:是,false:否 * * @return 生成的字符竄 */ public static String getCode(int length,Boolean isPureDigits,Boolean isUpperCase,boolean isTogether) { String val = ""; Random random = new Random(); for(int i = 0; i < length; i++){ //是否需要純數字或者純字母 String charOrNum = ""; if(isPureDigits!=null){ charOrNum= isPureDigits ? "num":"char"; }else{ charOrNum=random.nextInt(2) % 2 == 0 ? "char" : "num"; // 輸出字母還是數字 } //獲取字符或者數字 if("char".equalsIgnoreCase(charOrNum)) { val += (char) (getChoice(isUpperCase, random) + random.nextInt(26)); }else if("num".equalsIgnoreCase(charOrNum)) { // 數字 val += String.valueOf(random.nextInt(10)); } //字符和數字是否需要同時存在 if(isPureDigits==null&isTogether){ if(val.length()==length-1){ if(isPureAlphabet(val)){ val+=String.valueOf(random.nextInt(10)); break; } if(isPureDigits(val)){ val += (char) (getChoice(isUpperCase, random) + random.nextInt(26)); break; } } } } return val; } /** * 獲取隨機編碼的集合 * * @param length 隨機編碼的長度 * @param num 想要獲取書籍編碼的個數 * @param isPureDigits 是否是純數字 true:表示存數字,false:表示純字母,null:表示字母和數字均可 * @param isUpperCase 是否大寫 ,如果生成的字符串中有字母,可以設置值,true:表示大寫,false:表示小寫,null:表示大小寫都可以 * @param isTogether 字母和數字是否必須同時存在 true:是,false:否 * @return */ public static List<String> genCodes(int length, long num,Boolean isPureDigits,Boolean isUpperCase,boolean isTogether){ List<String> results=new ArrayList<String>(); for(int j=0;j<num;j++){ String val = getCode( length,isPureDigits,isUpperCase,isTogether); //val=val.toLowerCase(); if(results.contains(val)){ continue; }else{ results.add(val); } } return results; } /** * 生成驗證碼 * * @param codeLength 編碼長度 * * @return 驗證碼字符竄 */ public static String getVerifyCode(int codeLength) { int i; int count = 0; char[] str = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; StringBuffer pwd = new StringBuffer(""); Random r = new Random(); while (count < codeLength) { i = Math.abs(r.nextInt(str.length)); if (i >= 0 && i < str.length) { pwd.append(str[i]); count++; } } return pwd.toString(); } /** * 獲取字母對應的數值 * * @param isUpperCase 是否大寫 ,如果生成的字符串中有字母,可以設置值,true:表示大寫,false:表示小寫,null:表示大小寫都可以 * @param random 隨機數 * * @return 數值 */ private static int getChoice(Boolean isUpperCase, Random random) { int choice=0; // 字符串 if(isUpperCase!=null){ choice = isUpperCase ? 65 : 97; }else { choice= random.nextInt(2) % 2 == 0 ? 65 : 97; //取得大寫字母還是小寫字母 } return choice; } /** * 是否是純數字 * * @param str 需要檢查的字符竄 * @return true:是 false:否 */ private static boolean isPureDigits(String str) { // String regExp = // "^[A-Za-z]+(([0-9]+[A-Za-z0-9]+)|([A-Za-z0-9]+[0-9]+))|[0-9]+(([A-Za-z]+[A-Za-z0-9]+)|([A-Za-z0-9]+[A-Za-z]+))$"; String regExp = "^([0-9]+)$"; Pattern pat = Pattern.compile(regExp); Matcher mat = pat.matcher(str); return mat.matches(); } /** * 是否是純字母 * * @param str 需要檢查的字符竄 * * @return true :是 false:否 */ private static boolean isPureAlphabet(String str) { // String regExp = // "^[A-Za-z]+(([0-9]+[A-Za-z0-9]+)|([A-Za-z0-9]+[0-9]+))|[0-9]+(([A-Za-z]+[A-Za-z0-9]+)|([A-Za-z0-9]+[A-Za-z]+))$"; String regExp = "^([A-Za-z]+)$"; Pattern pat = Pattern.compile(regExp); Matcher mat = pat.matcher(str); return mat.matches(); } /** * 測試類 * * @param args 參數 * */ public static void main(String[] args) { boolean pureDigits1 = isPureDigits("6003l8"); System.out.println("pureDigits的值"+pureDigits1); // TODO Auto-generated method stub List<String> results=genCodes(6,100,null,false,true); System.out.println("results的值"+results); } }
