다양한 문자를 조합하여 ID 를 만들며 카운팅 수만큼 증가하여 문자열로 반환한다.
* 제목을 정하기 정말 힘들군요... 의미 전달이 전혀되지 않을 것 같네요;;
다양한 문자을 배열로 조합하여, 카운팅됨에 따라 오름차순 문자열을 완성하여 반환한다.
문자열 ID를 이용할 경우의 장점.
1. 숫자형이 아닌 문자열로 구현된 ID 및 코드를 구현할 때.
2. 쉽게 알아보기 힘든 코드를 구현할 때.
(숫자형으로 할 경우 GET 방식으로 쉽게 페이지를 호출할 수 있는 문제가 있다. 싸**드 같은 경우 비공개나 일촌공개로 설정된 사진도 날짜만 잘 조합하면 쉽게 열수 있는 문제가 있었다. 아마도 지금은 막았겠지만 또한 인젝션해킹이 문자열보다 인지하기 편해서 쉽게 이루어진다.)
3. 0~9 까지만 표현할 수 있는 숫자 조합보다 몇배 자료를 구현할 수 있다.
로직은 다음과 같다. 임의의 배열을 만들어 놓고, [a,z,s,e,1] 0 => a , 1 => z , 2 => s 각 문자의 실제 숫자값은 배열의 순서가 된다.
012 => azs 가 되는 것이다. 오름차값을 1을 할 경우 다음의 값은 aze 가 된다. 숫자,영문소문자,영문대문자 를 조합할 경우 한자리 표시를 61개까지 구성할 수 있다. 0~9 숫자로 할때에 비해 6배나 많은 량이다.
초기값은 원하는 자리수 만큼 정해줘야 한다. aaaa 가 4자리의 초기값이 되는 것이다. 다음 값은 aaaz 가 된다.
오름값은 생성하지 않을 경우 1111 일때 다음 값을 생성할때 오류가 발생한다.
소스 코드는 가장 많이 사용되는 자바스크립트로 개발하였고, 다시 자바로 컴버전하였다. 언어에 맞게 소스수정만 하면 어느 언어든 사용할 수 있을 것 이다. 자바는 http://commons.apache.org/lang 라이브러리의 ArrayUtils 사용했다.
* 예외처리는 직접 해주세요;;
* 제목을 정하기 정말 힘들군요... 의미 전달이 전혀되지 않을 것 같네요;;
다양한 문자을 배열로 조합하여, 카운팅됨에 따라 오름차순 문자열을 완성하여 반환한다.
문자열 ID를 이용할 경우의 장점.
1. 숫자형이 아닌 문자열로 구현된 ID 및 코드를 구현할 때.
2. 쉽게 알아보기 힘든 코드를 구현할 때.
(숫자형으로 할 경우 GET 방식으로 쉽게 페이지를 호출할 수 있는 문제가 있다. 싸**드 같은 경우 비공개나 일촌공개로 설정된 사진도 날짜만 잘 조합하면 쉽게 열수 있는 문제가 있었다. 아마도 지금은 막았겠지만 또한 인젝션해킹이 문자열보다 인지하기 편해서 쉽게 이루어진다.)
3. 0~9 까지만 표현할 수 있는 숫자 조합보다 몇배 자료를 구현할 수 있다.
로직은 다음과 같다. 임의의 배열을 만들어 놓고, [a,z,s,e,1] 0 => a , 1 => z , 2 => s 각 문자의 실제 숫자값은 배열의 순서가 된다.
012 => azs 가 되는 것이다. 오름차값을 1을 할 경우 다음의 값은 aze 가 된다. 숫자,영문소문자,영문대문자 를 조합할 경우 한자리 표시를 61개까지 구성할 수 있다. 0~9 숫자로 할때에 비해 6배나 많은 량이다.
초기값은 원하는 자리수 만큼 정해줘야 한다. aaaa 가 4자리의 초기값이 되는 것이다. 다음 값은 aaaz 가 된다.
오름값은 생성하지 않을 경우 1111 일때 다음 값을 생성할때 오류가 발생한다.
소스 코드는 가장 많이 사용되는 자바스크립트로 개발하였고, 다시 자바로 컴버전하였다. 언어에 맞게 소스수정만 하면 어느 언어든 사용할 수 있을 것 이다. 자바는 http://commons.apache.org/lang 라이브러리의 ArrayUtils 사용했다.
* 예외처리는 직접 해주세요;;
자바스크립트 소스
/**
* programmed by Seok Kyun. Choi. (최석균)
* http://syaku.tistory.com
*/
var number = ['0','1','2','3','4','5','7','8','9'];
var alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
var ALPHABET = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
var all = number.concat(alphabet).concat(ALPHABET);
function string2integer(str) {
var total = all.length;
var chr = str.length;
var data = [ ];
for (var c = (chr-1); c >= 0; c--) {
var s = str[c]; // 인수 문자
for (var i = 0; i < total; i++) {
var key = all[i];
if (key == s) { data.push(i); } // 인수의 문자와 all 배열의 문자가 일치할 경우 배열에 삽입.
}
}
return data; // 배열리턴
}
function integer2string(ar,num,is) {
var total = all.length;
var count = ar.length;
var is_key = false;
var data = [ ];
for (var i = 0; i < count; i++) {
var key = ar[i];
if (i ==0) { // 첫번째 배열에 인수의 값을 더함.
key = key + num;
}
if (is_key) { // 올림수 여부
key = key + 1;
}
if (key >= total) {
key = key - total;
is_key = true;
} else {
is_key = false;
}
data[(count-1)-i] = all[key]; // 역순으로 배열 생성.
}
if (is_key) { // 마지막 루프에서 올림수가 있을 경우 한자리 추가
if (is == false) {
alert('최고값을 넘었습니다.');
return null;
} else {
data.unshift('1');
}
}
return data.join(''); // , 제거하고 배열 조인.
}
function init(str,num,is) {
return integer2string(string2integer(str),num,is);
}
// 초기값 생성
var def = "000";
document.writeln(def);
// 반복문으로 테스트
for(var i = 0; i < 1000; i++) {
def = init(def,1,false);
document.writeln(def);
}
결과 : 000 001 002 003 004 005 007 008 009 00a 00b 00c 00d ................
자바 예제 소스
String str = "0dasdweZ"; out.print(CountUtils.get(str,1,false)); // 0dasdwf0 결과
/**
* @class CountUtils
* @brief 숫자 , 문자열을 포함한 증가값을 생성한다.
*
* registered date 20101019
* programmed by Seok Kyun. Choi. (최석균)
* http://syaku.tistory.com
*/
package com.syaku.util;
import org.apache.commons.lang.ArrayUtils;
public class CountUtils {
private static char number[] = {'0','1','2','3','4','5','7','8','9'};
private static char alphabet[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
private static char ALPHABET[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
private static char all[] = ArrayUtils.addAll(ArrayUtils.addAll(number,alphabet),ALPHABET);
private static int total = all.length;
/**
* @method : string2number(parameter)
* @brief : 인자의 문자와 일치하는 값은 순번을 반환한다.
* @parameter : 문자열
* @return : int[]
*/
public static int[] string2number(String str) {
int chr = str.length();
char ch[] =str.toCharArray();
int[] data = { };
for (int c = (chr-1); c >= 0; c--) {
char s = ch[c]; // 인수 문자
for (int i = 0; i < total; i++) {
char key = all[i];
// 인수의 문자와 all 배열의 문자가 일치할 경우 배열에 삽입.
if (key == s) { data = ArrayUtils.add(data,i); }
}
}
return data;
}
/**
* @method : number2string(parameter1,parameter2,parameter3)
* @brief : 숫자형으로 얻은 순번배열을 parameter2 의 값만큼 더하고 순번의 문자값을 반환한다.
* @parameters {
parameter : int[] 숫자형 순번배열
parameter2 : int 카운트할 숫자값.
parameter3 : boolean - true 최고 값을 넘을 경우 예외처리함 , false 반올림처리함.
}
* @return : String 숫자형 순번배열의 순번 위치의 문자열을 조합하여 반환함.
*/
public static String number2string(int[] array,int num,boolean asc) {
int count = array.length;
boolean is_key = false;
char data[] = new char[count];
for (int i = 0; i < count; i++) {
int key = array[i];
if (i == 0) { // 첫번째 배열에 인수의 값을 더함.
key = key + num;
}
if (is_key) { // 올림수 여부
key = key + 1;
}
if (key >= total) {
key = key - total;
is_key = true;
} else {
is_key = false;
}
data[(count-1) - i] = all[key]; // 역순으로 배열 생성.
}
if (is_key) { // 마지막 루프에서 올림수가 있을 경우 한자리 추가
if (asc == false) {
return null;
} else {
ArrayUtils.add(data,0,'1');
}
}
// , 제거하고 배열 조인.
String ret = ArrayUtils.toString(data);
return ret.replaceAll("[{},]","");
}
/**
* @method : get(parameter1,parameter2,parameter3)
* @brief : 배열을 사용하여 오름 카운트를 구현함.
* @parameters {
parameter : 문자열
parameter2 : int 카운트할 숫자값.
parameter3 : boolean - true 최고 값을 넘을 경우 예외처리함 , false 반올림처리함.
}
* @return : String 숫자형 순번배열의 순번 위치의 문자열을 조합하여 반환함.
*/
public static String get(String str,int num,boolean asc) {
int data[] = string2number(str);
return number2string(data,num,asc);
}
}