-
- /*
- com_create_guid()는 php5 버전에서 지원되는 함수입니다.
- */
- function guid(){
- if (function_exists('com_create_guid')){
- return com_create_guid();
- }else{
- mt_srand((double)microtime() * 10000);//php 4.2.0 이상에서는 선택 사항.
- echo(mt_rand());
- $charid = strtoupper(md5(uniqid(rand(), true)));
- $ 하이픈 = chr(45);// "-"
- $uuid = chr(123)// "{"
- .substr($charid, 0, 8).$hyphen
- .substr($ charid , 8, 4).$hyphen
- .substr($charid,12, 4).$hyphen
- .substr($charid,16, 4).$hyphen
- .substr($charid, 20 ,12)
- .chr(125);// "}"
- return $uuid;
- }
- }
코드 복사 2, MD5:
guid와 마찬가지로 32자의 16진수 숫자가 출력됩니다. 차이점은 guid가 무작위로 생성되고, md5는 입력 데이터를 기반으로 생성되어야 한다는 것입니다.
예:
- $str = "안녕하세요";
- echo md5($str);
- ?>
코드 복사
출력 결과:
8b1a9953c4611296a827abf8c47804d7
장점: 입력된 시드 데이터를 기반으로 출력 값을 제어할 수 있습니다. 시드 데이터가 규칙적이고 반복되지 않는 경우 md5를 통해 데이터를 보호할 수 있으므로 큰 혼란이 발생합니다.
단점: 32비트 문자는 너무 길며 고유한 시드 데이터를 제공해야 합니다.
사용법: 높은 동시성, 초를 시드 데이터로 사용하면 중복이 계속 발생합니다.
예:
-
- /*
- * time() 함수와 함께 사용되며 1970년부터 1970년까지의 초 수를 사용합니다. 현재 시간을 시드 번호로 .
- */
- $str=time();
- echo md5($str);
- ?>
코드 복사
3, uniqid(): 13자리 또는 23자리 문자열을 반환합니다.
우리의 목적에 따라 uniqid()는 md5()의 향상된 버전과 같습니다. 특히 차등 식별자를 문자열 접두사로 사용할 수 있어 반복되는 이름 지정 가능성을 줄일 수 있기 때문입니다.
동시성이 높지 않은 극단적인 상황에서는 이미 일반적인 요구 사항을 충족할 수 있는 이 기능을 사용하는 것이 좋습니다.
정의: uniqid() 함수는 현재 시간(마이크로초)을 기준으로 고유 ID를 생성합니다.
사용법: uniqid(prefix,more_entropy)
참고: prefix는 출력 문자열에 접두사를 추가할 수 있습니다. more_entropy 매개변수가 true인 경우 23비트 문자열이 출력됩니다.
예:
-
- var_dump(uniqid());
- var_dump(uniqid("a"));
- ?> ;
코드 복사 출력 결과:
문자열(13) "51734aa562254" 문자열(14) "a51734aa562257"
장점: 13자리 문자열 길이는 허용되는 파일 이름 지정 길이입니다. 접두사를 추가할 수 있으며 결과에 데이터 난독화가 포함되어 원본 데이터를 역참조하는 것을 방지할 수 있습니다.
단점: md5와 유사하고 동시성이 높으며 초를 시드 데이터로 사용하지만 중복이 계속 발생합니다.
3. 업그레이드 버전 계획:
1. fast_uuid: 17자리를 반환합니다.
uniqid()의 불완전하게 사용자 정의된 버전과 마찬가지로 이 함수에 나타나는 "시드 번호 시작 시간" 개념은 매우 계몽적입니다.
time() 및 uniqid()에 사용되는 기본 시간은 1970년부터 계산되며 길이는 10자리(1366512439)입니다. "시드 번호 시작 시간"을 사용하면 이 값을 줄일 수 있습니다.
왜냐하면, 실제 수요 관점에서 보면 자동적으로 성장할 수 있는 가치일 뿐이기 때문입니다.
시작 시간을 맞춤화한 후에는 길이를 줄이는 것 외에도 혼란을 야기하는 역할도 할 수 있습니다.
예:
/* - * 매개변수 suffix_len은 문자열에 추가되는 임의의 숫자 수를 지정합니다. 생성된 ID 값, 기본값은 3입니다.
- * 알고리즘을 제공해 주신 "Ivan Tan| Tan Junqing DrinChing (at) Gmail.com"에게 감사드립니다.
- * @param int suffix_len
- * @return string
- */
- function fast_uuid($suffix_len=3){
- // 시드 번호 계산 시작 시간
- $being_timestamp = strtotime('2013-3-21');
$time = 폭발(' ', microtime());
- $id = ($time[1] - $ being_timestamp) . sprintf(' u', substr($time[0], 2, 6));
- if ($suffix_len > 0)
- {
- $id .= substr(sprintf( ' 0u', mt_rand()), 0, $suffix_len);
- }
- return $id;
- }
-
코드 복사
출력 결과:
29832412631099013
2, time() 임의의 숫자:
위의 예에서는 1초에 발생하는 여러 요청을 해결하기 위해 난수를 사용하는 방법이 나타났습니다.
두 가지 기능이 제공됩니다:
- function Random ($ length) { $ hash = '';
- $ chars = 'abcdefghijklmnopqrstuvwxyz0123456789Abcdefwghghijklmnopqrstuvyz. ;
- $max = strlen($chars) - 1;
- PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
- for($i = 0; $ i < $length; $i ) {
- $hash .= $chars[mt_rand(0, $max)];
- } // bbs.it-home.org
- return $hash;
- }
- function random2($length, $numeric = 0) {
- PHP_VERSION < '4.2.0' ? mt_srand((double)microtime() * 1000000) : mt_srand();
- $ seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35);
- $seed = $numeric ? (str_replace('0', '', $seed ).'012340567890') : ($seed.'zZ'.strtoupper($seed));
- $hash = '';
- $max = strlen($seed) - 1;
- for( $i = 0; $i < $length; $i ) {
- $hash .= $seed[mt_rand(0, $max)];
- }
- $hash 반환;
- }
- ?>
-
-
코드 복사
4. 최종 계획:
아이디어: 사용자 ID 초의 난수. 그 중 "userid 초"는 10진수에서 64자리로 변환되어 자릿수가 줄어듭니다.
설명하다:
userid: 16진수에서 "ZZZZ"의 최대값은 "16777215"와 같은 10진수로 변환되고, 10진수로 변환된 "ZZZ"의 최대값은 "262143"과 같습니다.
초: 자신만의 시간 시작 지점을 설정하세요.
* / 함수 hex64to10($m, $len = 0) { $m = (string)$m; $hex2 = ''; $Code = KeyCode;- for( $i = 0, $l = strlen($Code); $i < $l; $i ) {
- $KeyCode[] = $Code[$i];
- }
- $KeyCode = array_flip($KeyCode);
for($i = 0, $l = strlen($m); $i < $l; $i ) {
- $one = $m[$i];
- $hex2 .= str_pad(decbin($KeyCode[$one]), 6, '0', STR_PAD_LEFT);
- }
- $return = bindec($hex2 );
if($len) {
- $clen = strlen($return);
- if($clen >= $len) {
- return $return;
- }
- else {
- return str_pad($return, $len, '0', STR_PAD_LEFT);
- }
- }
- return $return;
- }
/**
- * 64자리 문자열을 10진수 문자열로 변환
- * @param $m string 64자리 문자열
- * @param $len 정수 길이가 충분하지 않은 경우 문자열의 길이를 반환하고, 0으로 채우면 0은 패딩이 없음을 의미합니다
- * @return string
- * @author 野马
- */
- 함수 hex10to64($m, $len = 0) {
- $KeyCode = KeyCode;
- $hex2 = decbin ($m);
- $hex2 = str_rsplit($hex2, 6);
- $hex64 = array();
- foreach($hex2를 $one으로) {
- $t = bindec($ one);
- $hex64[] = $KeyCode[$t];
- }
- $return = preg_replace('/^0*/', '', implode('', $hex64)) ;
- if($len) {
- $clen = strlen($return);
- if($clen >= $len) {
- return $return;
- }
- else {
- return str_pad($return, $len, '0', STR_PAD_LEFT);
- }
- }
- return $return;
- }
- < p> /**
- * 10진수 문자열을 64자리 숫자 문자열로 변환
- * @param $m string 10진수 문자열
- * @param $len 정수 문자열 길이를 반환하고, 길이가 충분하지 않으면 채우기 0, 0은 패딩이 없음을 의미합니다
- * @return string
- * @author 野马
- */
- function hex16to64($m, $len = 0) {
- $KeyCode = KeyCode;
- $hex2 = array();
- for($i = 0, $j = strlen($m); $i < $j; $i) {
- $hex2[] = str_pad(base_convert($m[$i], 16, 2), ' 0', STR_PAD_LEFT);
- }
- $hex2 = implode('', $hex2);
- $hex2 = str_rsplit($hex2, 6);
- foreach($hex2를 $one으로) {
- $hex64[] = $KeyCode[bindec($one)];
- }
- $return = preg_replace('/^0*/', '', implode('', $hex64) );
- if($len) {
- $clen = strlen($return);
- if($clen >= $len) {
- return $return;
- }
- else {
- return str_pad($return, $len, '0', STR_PAD_LEFT);
- }
- }
- return $return;
- }
- < ;p> /**
- * 16진수 문자열을 16진수 문자열로 변환
- * @param $m string 16진수 문자열
- * @param $len 정수 문자열 길이를 반환하고, 길이가 부족하면 0으로 채우고, 0은 패딩이 없음을 의미합니다
- * @return string
- * @author 野马
- */
- 함수 str_rsplit($str, $len = 1) {
- if($str == null || $str == false || $str == ' ') return false;
- $strlen = strlen($str);
- if($strlen <= $len) return array($str);
- $headlen = $strlen % $len;
- if($headlen == 0) {
- return str_split($str, $len);
- }
- $return = array(substr($str, 0, $headlen));
- return array_merge($return, str_split(substr($str, $headlen), $len));
- }
$a=idate("U");
- echo "rn
e:" . hex10to64($a);
- echo "rn
e:" . hex64to10(hex10to64($a)); 🎜>
-
-
- 코드 복사
-
-
규칙2:
-
-
- function dec2s4($dec) {
- $base = '0123456789_$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU VWXYZ' ;
- $result = '';
{
- $result = $base[$dec % 64] 를 수행하세요. $result;
- $dec = intval($dec / 64);
- } while ($dec != 0);
return $result;
- }
function s42dec($sixty_four) {
- $base_map = array ( '0' => 0, '1' => 1 , '2' => 2, '3' => 4, '6' => 6, ' 8' => 8, '9' => 10, '$' => 12, 'b' => => 14, 'd' => 16, 'f' => 18, 'i' => ; 20, 'j' => 22, 'm' => 25, 'o' => , 'p' => 27, 'r' => 29, 't' => 31, ' v' => 33, 'w' => 35, 'y' => 37, 'A' => 38 => 39, 'C' => 40, 'E' => 43, 'G' => ;45, 'I' => 46, 'K' => 49, 'M' => 51 , 'O' => 52, 'P' => 53, 'Q' => 54, 'R' => 55, '에스' => 56, '티' => 57, '유' => 58, '뷔' => 59, 'W' => 60, '엑스' => 61, 'Y' => 62, 'Z' => 63, );
- $result = 0;
- $len = strlen($sixty_four);
for ($n = 0; $n < $len; $n ) { - $result *= 64;
- $result = $base_map[$sixty_four{$n}];
- }< /p>
return $result;
- }
$a=idate("U");
- var_dump(dec2s4($a));
- var_dump(s42dec(dec2s4) ($a)));
-
复代码
算法效率测试:
-
-
$strarr = array();
- $time1 = microtime(true);
- for($i = 0; $i < 10000; $i) {
- $str = idate("U") $i;
- $strarr[] = "{$i}->$strrn
" ;
- }
- $time2 = 마이크로타임(true);
- $time3 = $time2 - $time1;
$time1 = 마이크로타임(true);
- for($i = 0; $i < 10000; $i) {
- $str = dec2s4(idate("U") $i);
- $ strarr[] = "{$i}->$strrn
";
- }
- $time2 = microtime(true);
- echo "rn
运行10000次用时(秒):" . ($time2 - $time1 - $time3);
-
复代码
测试结果:
규정1:0.1687250137329
규정2:0.044965028762817
结论:算法1虽然效率上差一些,但是可以把md5生成 16进可可以把md5生成 16进须字符串.
六、总结
本文内容의 关键点是使用10进转换为64进睥进行字符串的缩减.
例如,使用fast_uuid生成的17位数字,转换为64进符仅有7位字符;
여기에는 PHP 상이 포함되어 있습니다.
|