중복되지 않는 랜덤 숫자 리스트를 일반적으로는 shuffle 이라고 부른다. 쉽게 말해 이미 존재하는 숫자 리스트에 대해 트럼프 카드를 섞는 것 처럼 섞으면 중복되지 않는 랜덤 숫자 리스트를 만들 수 있다. 그런데 이렇게 하면 전체 숫자리스트를 저장해야 해서 메모리 사용이 많은 문제가 있다. 그리고 속도도 그렇게 빠른 편이 아니다. 
 리스트 아이템에 대해 섞는 대표적인 알고리즘은 Fisher–Yates shuffle(https://ko.wikipedia.org/wiki/%ED%94%BC%EC%85%94-%EC%98%88%EC%9D%B4%EC%B8%A0_%EC%85%94%ED%94%8C )이다. 

그런데 적당히 중복되지 않는 랜덤 숫자 리스트(적당히라는 의미는 security 관점에서 보면 하나의 숫자 다음의 숫자를 예측 할 수도 있다는 의미이다.)를 만들려고 한다면 암호화 알고리즘을 이용하면 괜찮을 거라는 생각을 했다. 데이터를 암호화 한다는 것은 복화화가 가능해야 하기 때문에 모든 대응이 1대1 이라는 의미이다. 이 말은 암호화된 결과는 중복되지 않는다는 의미이다. 대충 아래와 같은 생각을 할 수 있다. 

for i in range(N):
	new_i = 암호화(i)
    if new_i >= N:
    	continue
    print(new_i)

이렇게 출력된 new_i 는 N 보다 작을 것이고 중복되지 않을 것이다.

좋은 생각이긴 한데, 일반적인 암호화는 최소 block 이 64bit 이다. (blowfish 의 최소 blocksize 가 64bit 이다.)
간단히 32bit 이하 숫자에 대해서는 제공하는 암호화는 없다. 그래서 간단히 1대1 대응이 되는 연산을 반복해서 암호화 유사하게 만들어 보았다. 

코드는 
https://gist.github.com/yiunsr/d1186be93fb99119a15a0917efdb1d27  
에서 확인 할 수 있다. 

 

어떻게 하면 자연스러운 한국 주소를 만들 수 있을까? 고민하다가 이것도 사람들이 많이 사용하는 주소를 기준으로 하는게 좋을 것 같았다. 그래서 인구기준으로 한국주소를 정리 했다. 행정안전부_지역별(법정동) 성별 연령별 주민등록 인구수(https://www.data.go.kr/data/15099158/fileData.do) 데이터를 통해서 법정동(법정리) 별 인구수를 확인 할 수 있다. 이에 따라서 인구수가 적은 법정동(법정리)는 제거 했다.(전체를 포함할 경우 데이터가 너무 많아진다.)
우리가 사용하는 동 주소에는 행정동과 법정동이 있다. 경우에 따라서 행정동과 법정동 이름 자체가 다른 경우도 꽤 많다. (https://www.seoul.go.kr/seoul/autonomy_sub.do 에서 추가정보를 확인 할 수 있다. ). 그러나 가짜 데이터용을 만들면서 이런 것 까지는 신경쓰기는 힘들다. 

한국에서 주소는 시도, 시군구, 읍면동, 리 로 세분화되어있다. 시도는 특별시, 광역시, 도(경기도, 강원도...) 를 포함하는 체계이고, 시군구는 과천시, 수원시 같은 시와 부여군, 예산군 같은 군과 광진구, 성북구 같은 구를 포함하는 개념으로 경우에 따라서는 성남시 수정구까지를 하나의 구로 볼 수 있다. 읍면동은 우리가 흔히 알고 있는 주소이고, 리는 읍면에서만 사용 되는 주소 체계이다. 

한국 주소 종류는 지번주소와 도로명 주소가 있다. 도로명주소 체계를 확인해보니 도로명으로  ~대로, ~로, ~길이 있고 이 곁가지 도로에 ~대로2길 ~대로2번길   ~로 2길 ~로 2번길  형태로 되어있다.(지역에 따라서 번길을 사용하는지 길을 사용하는지에가 다르다. 두 개가 번호를 붙이는 방식이 다른 방식이라고 한다. ). 그리고 경우에 따라서 ~안길을 사용하는 경우도 있지만 이를 무시했다. 

그래서 대충 아래와 같은방식으로 가짜 주소 데이터를 만들 수 있을 것 같다.
1. 인구수에 따라서 확률적으로 지번주소(address_bunji.csv 이용)를 생성한다.
2. 인구수에 따라서 적당히 동주소를 확장한다. ( ex: 구의동  =>  구의2동, 인구수가 많을 수록 많은 큰 값의 n동이 생성대도록 한다.)
3. 인구수에 따라서 적당히 번-지를 상성한다. ( 인구수가 많으면 큰 번이 생성가능하도록 하고 지는 가능한 100보다 작게 한다. 경우에 따라서는 지가 0일 경우 번만 사용되기도 한다. )
4. address_bunji.csv에 법정동코드가 있는데 이 주소와 일치하는 도로명주소(address_road.csv 이용)를 찾아서 해당 도로명주소중 랜덤하게 선택한다.
5. address_road.csv 파일에 보면 확장형태가 있는데, 이에 따라서 도로명주소에 적당히 N확장형태를 붙여서 주소를 완성한다. ( 강원도,홍천군,가일길,번길  의 경우 가일길2번길 로 확장주소를 만들 수 있다.)
6. 추가적으로 주거 형태(아파트, 빌라, 단독주택)에 따라서 건물명이 필요할 수 있다. 이 부분을 차후 더 분석해보도록 하겠다.  

 

address_bunji.csv
0.38MB
address_road.csv
0.41MB

 

여러 language 에서 DB 테스트나 unittest 를 위한 random 데이터 생성기를 지원한다. Random Data generator 라든지 fake data generator 라는 이름으로 불린다. 이러한 라이브러리는 영어권 데이터는 잘 지원하는데 반해 한국어 데이터는 조금 데이터가 부족하게 있는 경우가 많다. 그래서 한국 사람 이름을 생성하다보면 좀 어색하게 생성되거나 기초 데이터 자체가 좀 적은 경우가 있다. 내 기준에서 한국어 인명 데이터가 가장 충실한 것은 https://github.com/faker-js/faker/blob/main/src/locales/ko/name/first_name.ts  Faker 라는 js 라이브러리이다. 그런데 address 데이터는 좀 아쉬웠다. 그래서 내가 라이브러리 까지 만들것은 아니지만 여러 데이터를 수집하고 있다. 
  우선 사람 이름(성씨 제외)은 대한민국 법원, 전자가족관계등록시스템 통계서비스에서 수집할 수 있다. https://stfamily.scourt.go.kr/st/StFrrStatcsView.do?pgmId=090000000025 에서 출생신고 하는 이름현황과 https://stfamily.scourt.go.kr/st/StFrrStatcsView.do?pgmId=090000000062 에서 개명신고 이름 현황을 확인 할 수 있다. 다만 이 통계가 상위 20개 밖에 안 보여주기 한 번에 얻을 수 없고, 일일 데이터에 대해 통계를 일일이 또는 프로그래밍으로 수집해야 한다. 그리고 이 통계가 대략적인 정보 밖에 수집할 수 없어서 모든 데이터를 획득할 수는 없다. 다만 일일 데이터를 잘 수집하면 한국사람들이 많이 사용하는 이름을 확인 할 수 있다. 
 개인적으로 프로그래밍으로 출생신고 데이터는 2008 부터, 개명신고 데이터는 2012년(2008년 부터 데이터 검색이 되지만 실제 데이터는 2011년 12월 부터 데이터가 존재했다.) 까지 수집해서 그 통계를 기록했다. 3번 이상 중복해서 나타나는 이름만을 첨부해서 올린다. 누군가 fake db 를 만들 때 유용하게 사용했으면 좋겠다.

남자이름.csv
0.02MB
여자이름.csv
0.01MB