영문 대문자 포함 시리얼 생성

<?

//지정된 자릿수의 랜덤한 숫자를 반환합니다. 최대 10까지 가능합니다. 4 이면 1000 에서 9999 사이의 랜덤 숫자
function get_rand_number($len=4) {

    if (empty($len) || !is_int($len)) $len = 4;
    else if ($len < 0) $len = abs($len);
    if ($len > 10) $len = 10;

    return rand(bcpow(10, $len - 1), bcadd(bcpow(10, $len), -1));
}

//지정된 자릿수의 숫자로된 시리얼을 반환합니다. - 를 포함하고 싶지 않을때는 $cut 이 $len 보다 크거나 같으면 됩니다.
function get_serial($len=16, $cut=4, $hipen='-'){

    if (empty($len) || !is_int($len)) $len = 16;
    else if ($len < 0) $len = abs($len);

    if (empty($cut) || !is_int($cut)) $cut = 4;
    else if ($cut < 0) $cut = abs($cut);

    list($usec, $sec) = explode(' ', microtime());

    $serial = str_replace('.', '', (string)bcmul(bcmul((float)$usec * 10000000 , (float)$sec) , get_rand_number(4)));
    $serial_length = strlen($serial);
    $sub = $len - $serial_length;

    if ($sub > 0) $serial .= (string)get_rand_number($sub);
    else if ($sub < 0) $serial = substr($serial, 0, $len);

    return preg_replace("`([0-9]{" . $cut . "})`", "$1" . $hipen, $serial, floor($len / $cut) - 1);
}

//넘어온 세자리수를 34진수로 변환
function get_simple_34($m){

    $str = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $div = floor($m[0] / 34);
    $rest = $m[0] % 34;

    return $str[$div] . $str[$rest];
}

//지정된 자릿수의 숫자와 영문으로된 시리얼을 반환합니다. - 를 포함하고 싶지 않을때는 $cut 이 $len 보다 크거나 같으면 됩니다. $len 은 짝수만 가능
function get_serial_mix($len=16, $cut=4, $hipen='-'){

    if (empty($len) || !is_int($len)) $len = 16;
    else if ($len < 0) $len = abs($len);

    if (empty($cut) || !is_int($cut)) $cut = 4;
    else if ($cut < 0) $cut = abs($cut);

    $len2 = (int)($len * 3 / 2);

    $serial = get_serial($len2, $len2, $hipen);

    $serial = preg_replace_callback("`.{3}`", "get_simple_34", $serial);

    return preg_replace("`(.{" . $cut . "})`", "$1" . $hipen, $serial, floor($len / $cut) - 1);
}

$serial = get_serial_mix(16, 4);
echo $serial;
?>

아래 숫자로된 것과 위의 두함수는 동일하며
새로 추가로 두개의 함수가 추가되었습니다.
|

댓글 16개

멋집니다!!
감사합니다. 보이님이 잘 활용 하시겠습니다. ㅎㅎ
사진이 흐려서 정확친 않지만
요새 티비에 나오는 오페라 가수인가 뮤지컬 가수인가
그사람 닮은거 같아요.
네 세분 감사합니다.
코드에서 고수의 향기가..
별말씀을요.

고맙습니다.
이번강좌는 '내가 만들어 쓰는 시리얼생성 함수' 군요!!
제목을 이렇게 잡는게 맞나요^^!
대박입니다^^!
ㅎㅎ 고맙습니다.
저는 엔피씨님 글에서 많이 배우는데....
여러분야에 걸쳐서 잘 아는것 같아요.
부끄럽습니다 ㅎㅎ
아직 그누에계신 여러 개발자분들께 못미칩니다ㅎㅎ

하나 스스로 위로하는 것은
여러가지를 알면 응용범위가 넓어 진다고 위로합니다.

그런점에서, 맨날 함수만 써오던 저에게
유창화님의 함수 분석,만들어 쓰기 기술은
제가 또 알아가야할 부분입니다^^!

인생 선배님들은 뭔가 달라도 다르다는게 느껴집니다!
음.. 제가 유창화님 스토커가 된 느낌이지만..
그래도 유창화님이 열린분이라는 생각에 남깁니다. ^^;

1. 하이픈 넣는 부분에 오류가 있습니다. (get_serial과 get_serial_mix 해당)
$cut의배수가 안되는 경우 마지막 하이픈이 나오지 않습니다. (예: $len=6, $cut=4 => XXXXXX, not XXXX-XX)
return preg_replace("`(.{" . $cut . "})`", "$1" . $hipen, $serial, floor($len / $cut) - 1);
대신
return preg_replace("`(.{" . $cut . "})`", "$1" . $hipen, $serial, floor( ($len-1) / $cut );
로 해야할 듯 합니다.

2. 홀수길이 시리얼의 마지막 자리는 항상 숫자입니다. (get_serial_mix 해당)
이는 get_simple_34 함수를 통해서 세자리 숫자를 받아서 두자리 믹스로 리턴받기에 발생하는 문제로 보이며,
해결하기 위한 한가지 방법으로, 원하는 길이를 현재보다 더 길게 늘려서 ( 예: 3->6, 4->6 식으로)
get_simple_34 함수처리후 마지막 믹스는 버리는 방식이 필요할 것 같습니다.

3. get_simple_34 함수.
우선 스트링이 36 자리이기에 현재로는 Y 나 Z 가 들어간 문자열은 발생하지 않습니다.
그보다 더 큰 문제는, 34->36으로 바꿨을때, get_simple_36 함수가 리턴해야 할 조합은 총 1,296가지입니다. 하지만 현재 get_simple_36 함수는 숫자 000~999, 총 1,000 가지수밖에 받아들이지 않습니다.
고로 296개의 두자리믹스는 발생되지 않습니다. (34->36 수정후 RS 이후 믹스는 발생하지 않습니다.)

1,2번은 간단한 오류이지만, 3번은 논리적 결함이 아닐까 생각합니다. ^^
이렇게 좋은 지적을 해주셔서 감사합니다.

1. 번 문제는 그게 맞네요. 제가 착각햇습니다. 감사합니다.

2. 번 문제는 제가 짝수만 가능하다고 위에 써놧는데 그런식으로 처리를 넣어야
할 문제 인거 같습니다. 감사합니다.

3. 번 문제는.......
그게 36자리였군요. 왜 전 34자라고 착각햇을까요.
알파벳이 24잔줄 알앗습니다. ㅠㅠ

36으로 바꾸엇을 경우
XX YY ZZ 와 같이 뒤쪽 알파벳의 연속된 두자는 생성안됩니다.
그렇지만 X Y Z 문자가 안나오는것은 아닙니다.

36으로 나눈 나머지가 35 면 Z 34면 Y 33이면 X .....
등으로 나올수 있습니다.

그리고 논리적인 결함이라기 보다는
원래 의도한 데로 입니다.

세자리 숫자를 두자리로 변경하기 위한 방법이지
36*36으로 딱 맞아떨어지기 위함이 아닙니다.

감사합니다.

좋은 내용 감사하며, 반영하여 수정토록 하겠습니다.
역시 쿨하게 받아주실거란 기대가 어긋나지 않았네요. ^^;
감사합니다. ^^*

2번 항목은, 제가 주석을 보지 못했습니다. 죄송합니다. ^^

3번 항목은, 아직도 궁금증이 해소되지 않았네요.
지금 코드로 get_simple_36 함수에 들어가는 인자가 000~999 인것으로 파악되는데,
그렇다면, 999에서 전환되는 RQ 이후의 믹스문자는 나오지 않습니다.
세자리 숫자를 두자리로 변경하기 위한 방법이라는 말씀에는 동의하지만,
시리얼키의 패턴을 두자리씩 잘라서 봤을때,
RS 부터의 패턴 (RS, RT, RU... XX, ... ZZ)은 시리얼키에 포함되지 않게 됩니다.
(1000이 사용되어야 RS가 리턴)
오히려 00, 11 과 같은 패턴을 사용하지 않고, RS, RT 등을 사용하는 것이 낫지 않을까 합니다. 물론 그렇다고 하더라도, 남은 260 (=296-36) 두자리 믹스들은 사용되지 않게 되겠죠.
시리얼키 알고리즘이 노출되지 않는 다는 조건이라 할지라도, 20% 가까이 되는 패턴이 정해진 규칙 (특정 패턴이후는)에 따라서 사용되지 않는다는 것은, 문제가 되지 않을까 합니다. ^^;
네에
사실 숫자세개를 두개로 바꾸기 위해선 많은 방법이 있겟지만
하나의 방법 정도로 받아들여주세요

치환될 문자열은 바꾸는것도 가능하니
순서만 바꿔도
풀기에는 조금 어렵지 않겠습니까?
네.. ^^
사실 직접 만드시는 것에 비해서, 저처럼 비평하는 것은 쉽습니다.
이렇게 공부거리를 던져주셔서 감사하게 생각하고 있습니다. ^^
예전에 비슷한거 만든적 있었는데
요걸 진작 알았으면 좋았을뻔했네요 ㅜㅜ
만드느라 수고 많이 하셨습니다. ^^
댓글을 작성하시려면 로그인이 필요합니다. 로그인

프로그램

+
제목 글쓴이 날짜 조회
13년 전 조회 1,650
13년 전 조회 966
13년 전 조회 1,263
13년 전 조회 769
13년 전 조회 638
13년 전 조회 1,294
13년 전 조회 983
13년 전 조회 834
13년 전 조회 750
13년 전 조회 915
13년 전 조회 701
13년 전 조회 1,223
13년 전 조회 935
13년 전 조회 632
13년 전 조회 1,232
13년 전 조회 861
13년 전 조회 1,599
13년 전 조회 1,022
13년 전 조회 3,496
13년 전 조회 1,563
13년 전 조회 2,151
13년 전 조회 780
13년 전 조회 430
13년 전 조회 1,112
13년 전 조회 1,905
13년 전 조회 800
13년 전 조회 2,038
13년 전 조회 740
13년 전 조회 1,091
13년 전 조회 1,795
13년 전 조회 1,118
13년 전 조회 777
13년 전 조회 1,478
13년 전 조회 3,786
13년 전 조회 507
13년 전 조회 578
13년 전 조회 762
13년 전 조회 3,904
13년 전 조회 1,251
13년 전 조회 1,421
13년 전 조회 1,438
13년 전 조회 736
13년 전 조회 613
13년 전 조회 757
13년 전 조회 1,572
13년 전 조회 934
13년 전 조회 1,269
13년 전 조회 2,467
13년 전 조회 927
13년 전 조회 1,252
13년 전 조회 1,364
13년 전 조회 711
13년 전 조회 3,463
13년 전 조회 1,222
13년 전 조회 2,736
13년 전 조회 1,076
13년 전 조회 763
13년 전 조회 808
13년 전 조회 685
13년 전 조회 1,258
13년 전 조회 1,345
13년 전 조회 2,661
13년 전 조회 4,242
13년 전 조회 701
13년 전 조회 3,265
13년 전 조회 642
13년 전 조회 1,101
13년 전 조회 698
13년 전 조회 1,076
13년 전 조회 1,826
13년 전 조회 1,139
13년 전 조회 619
13년 전 조회 1,282
13년 전 조회 890
13년 전 조회 1,291
13년 전 조회 1,765
13년 전 조회 1,065
13년 전 조회 718
13년 전 조회 1,905
13년 전 조회 1,184
13년 전 조회 770
13년 전 조회 711
13년 전 조회 1,070
13년 전 조회 607
13년 전 조회 1,719
13년 전 조회 1,003
13년 전 조회 1,020
13년 전 조회 653
13년 전 조회 1,290
13년 전 조회 2,099
13년 전 조회 616
13년 전 조회 516
13년 전 조회 689
13년 전 조회 3,281
13년 전 조회 747
13년 전 조회 1,304
13년 전 조회 1,078
13년 전 조회 727
13년 전 조회 7,727
13년 전 조회 1,101
🐛 버그신고