[Java] 고유값 만들기

고유한 값으로 사용할 만한 것은 UUID이다. UUID는 그 의미가 가지는 것 그대로 고유한 값이다. 그러나 저장소의 공간은 128 bits이며 문자열로 표현될 때 550e8400-e29b-41d4-a716-446655440000 처럼 그 길이가 상당히 길다. 물론 UUID는 이 기종의 하드웨어나, 시간 또는 공간적으로 다른 환경 모두에서 고유한 값을 제공해 주는 장점이 있다. 그런데, 만약 하나의 서버 내부에서 고유한 값이 필요하다면 어떨까? 한계는 있겠으나, 필자에게는 적합한 방법 중에 하나는 서버 측의 시간을 활용하는 것이다. Java에서 서버의 시간을 얻는 함수는 System.currentTimeMillis, 서버가 기동 된 후의 경과된 시간은 System.nanoTime를 통해 얻을 수 있다. 그 결과는 long형이므로 64 Bits이며, 문자열로 표현하면 대부분 21220887433392와 같이 14개면 표현이 가능하다. 그러나 나에게 고유값이 필요한 목적은 저장소에 저장할 필요는 없고 문자열로 표현했을때, 최대한 짧아야 한다는 것이다. 그런데 이 long 타입을 문자열로 표현하면 14개의 자리를 차지하는 것은 너무 길다. 짧게 표현하는 방법은 없을까? 이 long 값은 10진수이다. 이를 좀 더 높은 진수로 표현한다면 그 길이는 줄어들 것이다. 16진수, 32진수, 64진수, 128진수 등이 가능한데.. 표현 가능한 문자여야 하므로 64진수가 최적이다.

이러한 상황에서 아래의 코드 중 longToBase64라는 함수는 long 타입의 값을 받아 64진수로 진수 변환 방식을 통해 문자열로 변환해 주는 함수이다.

아래의 코드는 위의 함수를 테스트한 것으로, 1000개의 고유한 값을 얻는 기능을 수행한다.

위의 코드의 결과는 아래와 같은데, 실행하는 매 순간마다 다르게 표시될 것이다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다