디비프로그램을 하다가 항상 고민했던것이 무한한 unique ID 를 만들수 없을까 였다. autoincrement 의 습성은 불행히도 무한하지 않다는 문제가 있다. 기존에 사용하던 방법은 YYYYMMDDHHMMSS 형태의 날자에 랜덤숫자(0~0xffff) 를 합쳐서 사용하는 방법이였다. 하지만 아주 재수없는 확율 1/65536 로 겹칠 수 있다는 점과 1초안에 동시에 생성된 키가 순차적이 않다는 문제였다. 몇년동안 사용한 방식이지만 한번도 중복되지는 않았다. rand함수는 시드가 클경우 동일한 숫자를 연속으로 주지 않기 때문이다.
오늘 하루종일 고민하다가 새로운 로직을 생각해 냈다.
키를 생성하는 테이블을 하나 만들어서 autoincrement 필드 하나만 둔다음에 데이타를 하나 넣고 테이블 데이타를 모두 지운다. 데이타를 지워도 최종 입력키값은 읽을 수 있으므로 키값을 읽어와 날자와 함게 키값을 합쳐서 사용한다. 고유키가 일정수치(65536) 이상 도달하면 autoincrement 값을 초기화 해준다. 그러면 자신이 원하는 숫자만큼으로 round 되는 고유값을 얻게된다. 1초에 원하는숫자(65536) 이상의 고유키가 필요치 않는한 안전한 방법이다.
디비의 기본 함수로 이런 기능을 해주면 참 좋을건데 왜 안할까?