Java

[Java] 랜덤 문자열 생성, 랜덤 코드 생성(random값)

woo0doo 2023. 9. 17. 20:14

서론

 팅클이라는 프로젝트를 진행하면서 각 계정마다 random 코드 6자리를 만들어야하는 상황이 있었습니다. 이 random 코드는 친구추가할 때 사용되는 목적입니다.

 

구상

 저는 랜덤값을 만들 때, 사용자들끼리 무조건 겹치면 안된다는 조건이 붙으니까 겹칠 확률을 무조건 높여야 겠다고 생각했습니다. 처음에는 대중적으로 알려진 UUID.randomUUID를 쓰면 되겠지라고 간단하게 생각했었습니다.

하지만 예상과는 다르게 UUID.randomUUID는 알파벳 대문자도 없을 뿐더러 6자리까지 자른다고해도 자리당 36개의 가짓수 즉 60,466,176분의 1 확률로 생성이 됩니다. random uuid 만드는 것 치고는 확률이 너무 낮았습니다. 자리수를 늘리는 방법도 있었지만, 친구추가 코드이기 때문에 짧으면 짧을수록 좋아서 저는 대문자를 추가하는 랜덤 문자열 생성 Util을 만들게 되었습니다. 

 

UuidGenerateUtil

import java.util.Random;

public class UuidGenerateUtil {

    private final static int LENGTH_INT_RADIX = 6;
    private final static int leftLimit = 48; // numeral '0'
    private final static int rightLimit = 122; // letter 'z'

    public static String makeRandomUuid() {

        Random random = new Random();
        return random.ints(leftLimit, rightLimit + 1)
                .filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
                .limit(LENGTH_INT_RADIX)
                .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                .toString();
    }
}

 

이렇게 만들면 한자리당 62개가 들어가게 되고, 만약 코드가 6자리로 만들어지게 된다면 56,800,235,584분의 1 확률로 생성이 되게 됩니다. 앞선 uuid생성할 때는 60,466,176가짓수 였지만 확실히 늘어난 것이 보입니다. (숫자로 봐서 안커보일 수도 있는데 568억분의 1입니다)

 

이렇게함으로 써 각 사용자마다 random 값을 부여할 수 있게되었고 겹치는 걱정도 덜하게 되었습니다. 

 

결과

 

실제 코드 보러가기: https://github.com/DoDream-dev/Tinqle-Server/blob/develop/src/main/java/tinqle/tinqleServer/util/UuidGenerateUtil.java