영문 대문자 포함 시리얼 생성 > 개발자팁

개발자팁

개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.

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

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

본문

<?

//지정된 자릿수의 랜덤한 숫자를 반환합니다. 최대 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;
?>

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

댓글 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% 가까이 되는 패턴이 정해진 규칙 (특정 패턴이후는)에 따라서 사용되지 않는다는 것은, 문제가 되지 않을까 합니다. ^^;
네에
사실 숫자세개를 두개로 바꾸기 위해선 많은 방법이 있겟지만
하나의 방법 정도로 받아들여주세요

치환될 문자열은 바꾸는것도 가능하니
순서만 바꿔도
풀기에는 조금 어렵지 않겠습니까?
네.. ^^
사실 직접 만드시는 것에 비해서, 저처럼 비평하는 것은 쉽습니다.
이렇게 공부거리를 던져주셔서 감사하게 생각하고 있습니다. ^^
전체 64
개발자팁 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT