사용상에는 아무런 제한이 없습니다.
출처를 밝히고 퍼가는 것도 아무런 제한이 없습니다.
단, 교육(강좌)의 내용이나 출판(책)의 내용으로 포함되거나 인용 될수 없습니다.
몇가지 내용이 변경되었습니다.
1. 베이스가 되는 숫자 문자열을 36자로 유니크하게 생성합니다.
2. 유니크한 숫자에 랜덤한 5자리 소수 가 곱해집니다.
3. 자리수의 한도가 생겻습니다. 숫자형은 36자리 까지, 믹스형은 24자리까지 입니다.
4. 12자리 미만은 대량 생성시 중복이나 연번 발생 할수 있습니다. 생성시 중복체크는 필수 입니다.
[사용예시]
보통 이런 시리얼 번호는
미리 100 만건 정도를 데이타베이스에 생성해놓고
사용자 발급 요청이 있을시 사용되지 않은것중 하나를 발급합니다.
이미 생성할때 랜덤하게 되었기 때문에 발급되지 않은 것중 하나를 순차적으로 뽑아서 발급합니다.
발급후 발급 으로 상태를 변경합니다.
시리얼 사용 입력을 받을 때는 아이피당으로 하루 실패 5회 이상을 넘지 못하게 합니다.
악의적인 프로그램을 사용할수 있는 경우 때문입니다.
입력받은 시리얼은 데이타베이스에서 비교하여
존재하는 시리얼인지
발급되었던 시리얼인지
사용되었던 시리얼인지
체크 한 연후에 아무 이상이 없을 경우 사용 으로 상태를 변경하고
사용할수 있는 서비스 정보를 업데이트 합니다.
<?php
//지정된 자릿수의 랜덤한 숫자를 반환합니다. 최대 10까지 가능합니다. 4 이면 1000 에서 9999 사이의 랜덤 숫자
function get_rand_number($len=4) {
$len = abs((int)$len);
if ($len < 1) $len = 1;
else if ($len > 10) $len = 10;
return rand(pow(10, $len - 1), (pow(10, $len) - 1));
}
//넘어온 세자리수를 36진수로 변환해서 반환합니다. preg_match_callback 을 통해서만 사용됩니다.
function get_simple_36($m){
$str = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$div = floor($m[0] / 36);
$rest = $m[0] % 36;
return $str[$div] . $str[$rest];
}
//지정된 자리수에 존재하는 소수 전체를 배열로 반환합니다. max len = 5
function get_simple_prime_number($len=5){
$len = abs((int)$len);
if ($len < 1) $len = 1;
else if ($len > 5) $len = 5;
$prime_1 = Array(1, 2, 3, 5, 7);
if ($len == 1) return $prime_1;
$start = pow(10, ($len - 1)) + 1;//101
$end = pow(10, $len) - 1;//999
$prime = $prime_1;
unset($prime[0]);//1제거
unset($prime[1]);//2제거
$array = Array();
for($i = 11; $i <= $end; $i+=2){//10보다 큰 소수에는 짝수가 없다.
function get_simple_prime_number($len=5){
$len = abs((int)$len);
if ($len < 1) $len = 1;
else if ($len > 5) $len = 5;
$prime_1 = Array(1, 2, 3, 5, 7);
if ($len == 1) return $prime_1;
$start = pow(10, ($len - 1)) + 1;//101
$end = pow(10, $len) - 1;//999
$prime = $prime_1;
unset($prime[0]);//1제거
unset($prime[1]);//2제거
$array = Array();
for($i = 11; $i <= $end; $i+=2){//10보다 큰 소수에는 짝수가 없다.
$max = floor(sqrt($i));
foreach($prime as $j) {
if ($j > $max) break;
if ($i % $j == 0) continue 2;
}
$prime[] = $i;
if ($i >= $start) $array[] = $i;
}
return $array;
}
foreach($prime as $j) {
if ($j > $max) break;
if ($i % $j == 0) continue 2;
}
$prime[] = $i;
if ($i >= $start) $array[] = $i;
}
return $array;
}
//지정된 자릿수의 숫자로된 시리얼을 반환합니다. - 를 포함하고 싶지 않을때는 $cut 이 $len 보다 크거나 같으면 됩니다. max len = 36
function get_serial($len=16, $cut=4, $hipen='-'){
$len = abs((int)$len);
if ($len < 1) $len = 16;
else if ($len > 36) $len = 36;
$cut = abs((int)$cut);
if ($cut < 1) $cut = 4;
else if ($cut > $len) $cut = $len;
list($usec, $sec) = explode(' ', microtime());
$base_number = (string)$sec . str_replace('0.', '', (string)$usec);
$base_number .= (string)get_rand_number(10) . (string)get_rand_number(8);//36자리 유니크한 숫자 문자열
$base_number = (string)$sec . str_replace('0.', '', (string)$usec);
$base_number .= (string)get_rand_number(10) . (string)get_rand_number(8);//36자리 유니크한 숫자 문자열
$prime = get_simple_prime_number(5);//5자리 소수 배열
shuffle($prime);
$prime = $prime[0];//랜덤한 5자리 소수
$serial = bcmul(substr($base_number, 0, $len), $prime);
$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("`(.{" . $cut . "})`", "$1" . $hipen, $serial, floor(($len-1) / $cut));
}
//지정된 자릿수의 숫자와 영문으로된 시리얼을 반환합니다. - 를 포함하고 싶지 않을때는 $cut 이 $len 보다 크거나 같으면 됩니다. max len = 24
function get_serial_mix($len=16, $cut=4, $hipen='-'){
$len = abs((int)$len);
if ($len < 1) $len = 16;
else if ($len > 24) $len = 24;
$cut = abs((int)$cut);
if ($cut < 1) $cut = 4;
else if ($cut > $len) $cut = $len;
$len2 = (int)($len * 3 / 2);
if ($len2 % 2 == 1) $len2 += 1;
$serial = get_serial($len2, $len2, $hipen);
$serial = substr(preg_replace_callback("`.{3}`", "get_simple_36", $serial), 0, $len);
return preg_replace("`(.{" . $cut . "})`", "$1" . $hipen, $serial, floor(($len-1) / $cut));
}
echo get_serial_mix(16, 4, '-');
?>
댓글 14개
게시글 목록
| 번호 | 제목 |
|---|---|
| 16762 | |
| 16759 |
JavaScript
top.location.href= 에서 타켓 지정하는 방법은 어떻게 하나요>
2
|
| 16758 | |
| 16755 |
JavaScript
이동하는 글자
2
|
| 16752 |
JavaScript
자바스크립트 메뉴 문제입니다
2
|
| 16746 |
PHP
PHP 속도 향상 팁
5
|
| 16743 |
JavaScript
jQuery 드롭다운메뉴
2
|
| 30241 | |
| 16739 |
PHP
이게 잘못된건가요? ㅋ
3
|
| 16737 | |
| 16735 | |
| 16734 | |
| 16725 | |
| 16723 | |
| 16721 | |
| 16720 |
Linux
파일이나 프로그램 모니터링하기
|
| 30235 | |
| 16716 | |
| 30228 | |
| 16714 | |
| 30220 | |
| 30218 |
HTML
드림위버 롤오버요~
1
|
| 30210 |
HTML
요걸우째설명해야될지;;;
7
|
| 30206 |
HTML
li 가로정렬
3
|
| 4077 | |
| 16713 | |
| 16711 |
JavaScript
만화 권당 팝업드는방법 알려주세요
1
|
| 30190 | |
| 16710 |
jQuery
jQuery 입력박스 툴팁 소스
|
| 30188 | |
| 16707 |
jQuery
초보입니다... 도와주세요 ㅠㅠ
2
|
| 26290 |
기획서
사업진행스케쥴표
13
|
| 30182 | |
| 16701 |
MySQL
mysql select 질문점 굽신굽신
5
|
| 16698 |
JavaScript
고수님들 부탁드려요ㅠㅠㅠ 자바스크립트가 익스 6에선 먹히질 않습니다ㅠㅠㅠ
2
|
| 16691 |
Mobile
스마트폰에서 ip camera 영상 보는 방법
6
|
| 4074 | |
| 16687 |
jQuery
회원이 메뉴색 변경하는 소스 질문드립니다.
3
|
| 16685 |
Linux
SSH로 sql 패치 방법
1
|
| 4070 | |
| 16683 | |
| 30168 | |
| 16682 |
MySQL
MySQL For C API
|
| 30166 | |
| 16680 | |
| 16679 | |
| 16674 | |
| 16671 |
MySQL
mysql backup shell
2
|
| 16664 |
MySQL
cron backup shell
6
|
| 30156 |
HTML
css 로 레이아웃 컨트롤
9
|
| 16660 |
JavaScript
input박스 길이문제
3
|
| 16657 | |
| 24373 | |
| 16654 |
Linux
리눅스시스템 스와핑 줄이기
2
|
| 16653 |
PHP
페이지 개수를 정하고 싶어요
|
| 30150 | |
| 16652 | |
| 16649 |
JavaScript
인자별 함수 실행 part2
2
|
| 4066 | |
| 16647 | |
| 16646 |
MySQL
mysql5.0으로 업데이트했는데
|
| 16643 |
JavaScript
인자별 함수 중복 실행 방법
2
|
| 16637 |
JavaScript
파이어 폭스 호환성질문...;
5
|
| 16634 | |
| 30148 | |
| 16633 | |
| 16629 |
JavaScript
스트립트 오류좀 봐주세요 ㅠㅠ
3
|
| 16627 |
PHP
[수정]아파치 타임아웃
1
|
| 30138 | |
| 16624 | |
| 16622 | |
| 16619 |
MySQL
애왜안될까요;;;
2
|
| 16618 |
Linux
저거 뭘까요?
|
| 30135 | |
| 30128 | |
| 16615 |
MySQL
이런젠장 값전달이 안되네요
2
|
| 30109 | |
| 16613 | |
| 16611 | |
| 16606 | |
| 16605 | |
| 16604 |
JavaScript
스크립트한번만봐주세요 ㅠ
|
| 16599 |
MySQL
mysql 속도 문제..
4
|
| 16594 | |
| 16593 | |
| 16589 | |
| 16587 | |
| 16572 | |
| 4047 | |
| 16566 | |
| 30107 | |
| 16564 | |
| 16561 | |
| 16558 |
MySQL
콤마 어떻게 찍는지 좀 가르쳐 주세요.
2
|
| 16557 | |
| 16552 | |
| 16548 | |
| 16546 | |
| 16543 |
JavaScript
고수님들 중 이런 에러 보신적 있으신가요?
2
|
| 16526 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기