단위테스트를 위한 주민등록번호 생성

최근 Service 개발에서 반복적인 Account 생성이 필요한 테스트 케이스가 있어서 작업 중 Remote Server에서 주민등록번호 Validation 을 하는 바람에 급히 검색하여 다음과 같은 내용을 알아내었다.

예를 들어 640713-1018433 이 주민번호를 예로 들어보죠
우선 주민등록번호 마지막자리수만 제외하고,
각각의 자리수마다 다음과 같은 수를 곱하여 전체를 더한다.

6 4 0 7 1 3 1 0 1 8 4 3
x x x x x x x x x x x x
2 3 4 5 6 7 8 9 2 3 4 5
-----------------------
+ + + + + + + + + + + +

즉, (6*2)+(4*3)+(0*4)+(7*5)+(1*6)+(3*7)+(1*8)+(0*9)+(1*2)
+(8*3)+(4*4)+(3*5) = 151

그러면 151 이란 수가 나온다. 이 151을 매직키인 11로 나누어 나머지만 취한다.

151 / 11 = 몫: 13 <-- 버림

나머지: 8

마지막 단계로 매직키인 11에서 나머지 8을 빼면 3이란 수가 나오
는데, 이숫자가 주민등록번호 마지막 자리의 숫자와 일치하면 대한민국 국민이다.

11 - 8 = 3 --> 정상적인 주민등록번호임 
출처 : http://blog.naver.com/foenix/40040223161

이 내용을 다음과 같은 메서드로 만들어 보았다.


	public static String getSSN() {
Random rand = new Random();
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(rand.nextLong());
String s1 = new SimpleDateFormat("yyMMdd").format(cal.getTime());
String s2 = null;

while(s2 == null || s2.length() < 6) {
s2 = Integer.toString(rand.nextInt(299999));
}
int sum = 0;
for (int i = 0; i < s1.length(); i++) {
sum += Integer.parseInt(String.valueOf(s1.charAt(i))) * (i + 2);
int j = i < 2 ? i + 8 : i;
sum += Integer.parseInt(String.valueOf(s2.charAt(i))) * j;
}
int bit = 11 - (sum % 11);

return s1 + "-" + s2 + (bit == 10 ? 0 : bit);
}

댓글

  1. 2000년생 이후도 동작하면 대박.

    답글삭제
  2. 3번 4번 있고 외국인은 5번 6번 있는데... 쩝...

    답글삭제
  3. 비슷한 문제인 신용카드 인증 문제가 문득 기억나네요.
    2차 P-camp때 김창준님이 자신의 세션에서 신용카드 문제를 TDD로 해결하는 방법을 보여주셨는데, 당시 TDD 초보였던지라 너무 감동을 받았던-_- 기억이...

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

낡은 방식으로 PHP를 사용하고 있는 조직의 개발환경 개선 방안 구상

프로그래머가 되기까지...