개발 관련/개인 자료

[Java] 간단한 랜덤 문자열 만드는 클래스.

snoworca 2013. 8. 2. 16:52
일을 하다보면 작성하기 귀찮은 코드들을 찾기 위해 구글링을 통하여 무한 복불을 한다. 랜덤 문자열 생성도 마찬가지로 이곳저곳 검색해서 많이 사용 했었는데, 간혹 특정한 문자 값들로 랜덤 문자열을 만들거나, 또는 랜덤 문자열에서 제외할 문자 값을 설정할 필요가 있어서 만들었다.

:: 사용법


String randStr;
// 숫자를 제외한 길이 32의 랜덤 문자열 생성.
randStr =  new RandomStringBuilder().
           putExcludedChar(RandomStringBuilder.NUMBER).
           setLength(32).build();
System.out.println(randStr);
     
// 알파벳으로 이루어진 길의 32의 랜덤 문자열 생성.
randStr =  new RandomStringBuilder().
           putLimitedChar(RandomStringBuilder.ALPHABET).
           setLength(32).build();
System.out.println(randStr);
     
// 대문자와 특수문자로 이루어져있고, ?.,&$/\"' 를 제외한 길이 32의 랜덤 문자열 생성.
randStr =  new RandomStringBuilder().
           putLimitedChar(RandomStringBuilder.ALPHABET_UPPER_CASE).
           putLimitedChar(RandomStringBuilder.SPECIAL).
           putExcludedChar("?.,&$/\\\"'").
           setLength(32).build();
System.out.println(randStr);


결과 
   
Qs1Nyp4CA(oo-GbUPNvZ~eO=yDgHKKev 
aCDjMUySCJjKieiymEoiooBYYKKitIgq       
R>D=HJ[]P#I-]|@~FP%-Q:M}`DN_~KK=     


::: RandomStringBuilder 클래스 내부

public
class RandomStringBuilder {
     
    public static final String NUMBER = "0123456789";
    public static final String ALPHABET_LOWER_CASE = "abcdefghijkmnlopqrstuvwxyz";
    public static final String ALPHABET_UPPER_CASE = "ABCDEFGHIJKMNLOPQRSTUVWXYZ";
    public static final String ALPHABET = ALPHABET_LOWER_CASE + ALPHABET_UPPER_CASE;
    public static final String SPECIAL = "~!@#$%^&*()_+{}|\\\"`;:'<>?,./=-[]";
     
     
    private HashSet<character> mExcludedCharSet = new HashSet<character>();
    private ArrayList<character> mLimitCharList = new ArrayList<character>();
             
    int mLength = 32;
     
    public String build() {
        return generateRandomString(mLength);
    }
     
    public RandomStringBuilder setLength(int length) {
        mLength = length;
        return this;
    }
     
    public int getLength() {
        return mLength;
    }
     
    public RandomStringBuilder putExcludedChar(char excluded) {
        mExcludedCharSet.add(excluded);
        return this;
    }
     
    public RandomStringBuilder putExcludedChar(char[] excludedList) {
        for(char excluded : excludedList)
                putExcludedChar(excluded);
        return this;
    }
     
    public RandomStringBuilder putExcludedChar(String excluded) {
                putExcludedChar(excluded.toCharArray());
        return this;
    }
     
    public RandomStringBuilder putLimitedChar(char limited) {
        mLimitCharList.add(limited);
        return this;
    }
     
    public RandomStringBuilder putLimitedChar(char[] limitedList) {
        for(char limited : limitedList)
                putLimitedChar(limited);
        return this;
    }
     
    public RandomStringBuilder putLimitedChar(String limited) {
        putLimitedChar(limited.toCharArray());
        return this;
    }
     
    public boolean removeExcluded(char excluded) {
        return mExcludedCharSet.remove(excluded);
    }
     
    public boolean removeLimitedChar(char limited) {
        return mLimitCharList.remove((Character)limited);
    }
     
    public void clearExcluded() {
        mExcludedCharSet.clear();
    }
    public void clearLimited() {
        mLimitCharList.clear();
    }
     
     
    /**
     * 랜덤 문자열 생성.
     * @param length 문자열 길이
     * @return 랜덤 문자열
     */
    public String generateRandomString(int length) {
        boolean runExcludeChar = !isExcludedCharInLimitedChar();           
        StringBuffer strBuffer = new StringBuffer(length);
        Random rand = new Random(System.nanoTime());
        for(int i = 0; i < length; ++i ) {
            char randomChar = makeChar(rand);
            if(runExcludeChar)
                randomChar = excludeChar(rand, randomChar);
            strBuffer.append(randomChar);
        }
        return strBuffer.toString();
    }
     
    private boolean isExcludedCharInLimitedChar() {
        return mExcludedCharSet.containsAll(mLimitCharList);
    }
     
    private char excludeChar(Random rand, char arg) {
        while(mExcludedCharSet.contains(arg)) {
            arg = makeChar(rand);
        }
        return arg;
    }
    private char makeChar(Random rand) {
        if(mLimitCharList.isEmpty())
            return (char)(rand.nextInt(94) + 33);
        else
            return mLimitCharList.get(rand.nextInt(mLimitCharList.size()));
    }
}