⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 passwordgenerator.java

📁 本系统有十分强大的功能
💻 JAVA
字号:
package org.opencustomer.framework.util.password;

import java.util.ArrayList;
import java.util.Random;

public final class PasswordGenerator
{
    private Profile profile;
    
    private Random random;
    
    public PasswordGenerator() {
        this(Profile.DEFAULT_PROFILE, null);
    }

    public PasswordGenerator(String secret) {
        this(Profile.DEFAULT_PROFILE, secret);
    }
    
    public PasswordGenerator(Profile profile) {
        this(profile, null);
    }
    
    public PasswordGenerator(Profile profile, String secret)
        throws IllegalArgumentException {
        int size = profile.getGroupSize();
        
        // check number of profiles
        if(size == 0) {
            throw new IllegalArgumentException("a profile must have at least 1 group");
        }
        
        // check sum of minimum
        int min = 0;
        for(int i=0; i<size; i++) {
            min += profile.getGroupMin(i);
        }
        if(min > profile.getPasswordMinLength()) {
            throw new IllegalArgumentException("the sum of group minimums may not be greater than the password minium length (length="+profile.getPasswordMinLength()+")");
        }
        
        // check sum of maximum
        int max = 0;
        for(int i=0; i<size; i++) {
            max += profile.getGroupMax(i);
        }
        if(max < profile.getPasswordMaxLength()) {
            throw new IllegalArgumentException("the sum of group maximums may not be smaller than the password maximum length (length="+profile.getPasswordMaxLength()+")");
        }
        
        this.profile = profile;
        
        int secretHash = 0;
        if(secret != null) {
            secretHash = secret.hashCode();
        }
        this.random = new Random(System.currentTimeMillis()+secretHash);
    }
    
    public Profile getProfile() {
        return profile;
    }
    
    public String generate() {
        return generate(null);
    }
    
    public String generate(String base) {
        if(base != null) {
            random.setSeed(System.currentTimeMillis()+base.hashCode());
        }
        
        State state = new State(profile);
        int size = profile.getGroupSize();
        
        StringBuilder password = new StringBuilder();
        
        int passwordLengh = profile.getPasswordMinLength();
        if(profile.getPasswordMaxLength()-profile.getPasswordMinLength() > 0) {
            passwordLengh += random.nextInt(profile.getPasswordMaxLength()-profile.getPasswordMinLength()+1);
        }

        for(int i=0; i<passwordLengh; i++) {
            
            ArrayList<Group> usedGroups = new ArrayList<Group>();
            for(int j=0; j<size; j++) {
                if(state.getQuantity(j) < profile.getGroupMin(j))
                    usedGroups.add(profile.getGroup(j));
            }
            if(usedGroups.isEmpty()) {
                for(int j=0; j<size; j++) {
                    if(state.getQuantity(j) < profile.getGroupMax(j))
                        usedGroups.add(profile.getGroup(j));
                }
            }
            
            Group group = usedGroups.get(random.nextInt(usedGroups.size()));
            password.append(group.getCharacterByRandom(random));
            int index = getIndex(group);
            state.incrementQuantity(index);
        }
        
        return password.toString();
    }

    private int getIndex(Group group) {
        int size = profile.getGroupSize();
        for(int i=0; i<size; i++) {
            if(profile.getGroup(i).equals(group))
                return i;
        }
        
        return -1;
    }
    
    private final class State {
        
        private int[] quantities;
        
        public State(Profile profile) {
            quantities = new int[profile.getGroupSize()];
        }
        
        public int getQuantity(int index) {
            return quantities[index];
        }
        
        public void incrementQuantity(int index) {
            quantities[index]++;
        }
    }
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -