package sgk.norkts.sgk; import java.security.MessageDigest; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PassGenerate { public static List<Map<String, String>> lists = new ArrayList<Map<String, String>>(); public static String[] chars = "0123456789abcdefghijklmnopkrstuvwxyzABCDEFGHIJKLMNOPKRSTUVWXYZ!@#$%^&*()_+-=`~?><,.".split(""); public static int size = chars.length; public static void main(String[] args){ generatePass(4); } public static void generatePass(int len){ Map<String, String> item = new HashMap<String, String>(); double count = 0; for(double index = 0; index < Math.pow(chars.length, len); index++){ String pass = getNumPass(index); //item.put("pass", pass); //item.put("md5", md5(pass)); count++; synchronized(lists){ //lists.add(item); } } System.out.println(count); } public static String getNumPass(double num){ int len = 1; int pos = 0; if(num % size == 0){ pos = 1; } while(Math.pow(size, len) < num){ len += 1; } len += pos; int[] arr = new int[len]; int count = len - 1; while(num >= size){ arr[count] = (int) (num % size); num = Math.floor(num/size); count--; } arr[count] = (int)num; String result = ""; for(int i = 0; i < len; i++){ result += chars[arr[i]]; } return result; } public static String md5(String s){ char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; try { byte[] btInput = s.getBytes(); // 获得MD5摘要算法的 MessageDigest 对象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字节更新摘要 mdInst.update(btInput); // 获得密文 byte[] md = mdInst.digest(); // 把密文转换成十六进制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } } public static class SavePass extends Thread{ public void run(){ while(true){ while(PassGenerate.lists.size() > 0){ Map<String, String> item = PassGenerate.lists.get(0); synchronized(PassGenerate.lists){ PassGenerate.lists.remove(0); } System.out.println(item.get("md5") + "=" + item.get("pass")); } } } } }
基本思路,将密码生成转换为n进制数字的循环,通过将n进制各位数的值替换成字符串,即可得到