SW-PRODUCT/개발-웹닭·HTTP

10진수 / 36진수 / 62진수

굴돌 2013. 7. 25. 15:03


가끔 인터넷에 보면 일련번호로써 a0z1 같은 문자열을 쓰는 경우가 있다.


보통 숫자를 쓸때는 10진수 그대로 문자열로 마꿔 화면에 뿌리지만,

36진수..그러니까 Long.toString( value, 36 ) 같이 바꿔서 뿌리면 36진수로 문자열을 만들게 된다.

62진수는 내가 아는건 Java의 기번 36진수가 알파벳 소문자만을 써서 [0-9a-z] 문자를 사용하는데 여기에 대문자를 더해 [0-9a-Z]를 하게 되면 62진수가 나온다.


참고로 base64는 8비트가 아닌 6비트를 쓰겠다는 얘기여서 근본적으로 다른 얘기다. 문자열 길이가 줄지 않고 는다.


아무튼 뭔가 있어보이기도 하고, 공간절약도 될것 같아서 문자열로 바꿔볼까 했는데...

36진수의 경우 int max 값에 대해서 zik0zj 값으로 변환되고 6바이트 사용한다... 근데 int는 4바이트이다..;; 36^4(약 1백만)을 넘어가는 숫자들에 대해서는 오히려 저장공간을 더 먹는다...;;

int가 2십억까지 가능하니 공간효율은 없다고 봐야한다.

62진수의 경우 62^4(약 1.5천만) 까지만 짧거나 같고 나머지는 그냥 int 쓰는게 공간효율은 좋다.


뭐 대충 그런 식이다.

db 저장공간 측면에서는 별 도움이 안되고.

문자열 길이로 봤을 때 long max가 19글자인데, 36진수는 13글자, 62진수는 11글자이다.

int max로 따지만 10글자, 6글지, 6글자...

크다고 하면 큰 차이지만, 숫자가 아니면 읽기 힘들어진다는 점을 생각하면 좋은건지 잘 모르겠다.


물론 url에 들어갈때는 통신도 문자열 상태로 하고, 그쪽에서 로깅이나 db에 넣을 때 문자 상태로만 다루기 때문에

4바이트가 아닌 19바이트를 쓰는거고, 충분히 효과는 있어 보이긴 한다.


뭐 그렇다고...


[ int max ]

2,147,483,647, 10
zik0zj, 6
2lkCB1, 6


[ long max ]
9,223,372,036,854,775,807, 19
1y2p0ij32e8e7, 13
aZl8N0y58M7, 11


[ 62진수 4자리 max ]

14,776,335, 8
8sphr, 5
ZZZZ, 4