我需要创建一个UID,并给出前几个组件 - 句点之间的部分(。) - 我创建了一个执行此操作的功能。生成此UID的规则是,它不能在组件中具有任何前导零,除非它在其自己的组件中为零。因此: 1.2.6.4.0.123.6653 很好,而 1.2.6.4。 0 123.6653 不是。
我的功能如下:
function genUid($type, $serverId){
$prefix = '1.2.3.3680043.19.1944';
$ts = date('YmdHis');
$uniqid = substr(hexdec(uniqid()),-7);
$uid = $prefix . '.' . $serverId . $type . '.' . $ts . '.' . $uniqid;
// the uniqid can't start with a leading 0
//$re = '/\.0\d]/';
$re = '/\.0[0-9]/';
preg_match($re, $uid, $matches);
if(count($matches)){
genUid($type, $serverId);
}
return $uid;
}
我只是通过
来调用它for($i=0; $i<100000; $i++){
$id = genUid('3', '1');
echo $id . '<br>';
}
echo '<hr>Longest run circa 86,000';
当我运行脚本时,它会显示100,000个UID。要检查我搜索一个句点,然后是零,然后是任何其他数字,1到9.所有看起来都很好,直到我想要检查&#34; .00&#34;在这种情况下,似乎总会产生一个。
正如您所看到的,如果函数发现它创建的UID与正则表达式匹配,则该函数应调用自身&#39; /。0 \ d /&#39; (我试过&#39; /。0 [0-9] /&#39;也看它是否有任何区别,它没有做到但是它似乎总是创造不超过一个失败的UID UID命名规则。
脚本没有超时(大约需要5秒才能完成)所以我有点困惑为什么这个功能没有正确调用自己,或者我的正则表达式不正确?恕我直言,它永远不应该创建违反规则的UID。
任何人都可以给我一些指导,说明原因吗?
答案 0 :(得分:1)
递归调用函数时,需要if(count($matches)){
return genUid($type, $serverId);
}
函数的值:
.
从一般意义上讲,您似乎是从gettimeofday
个字符分隔的整数中创建一个id。我可以建议gettimeofday
和mt_rand
函数吗? mt_rand
将为您提供当前时间为两个整数(自纪元以来的秒数,以及秒中的微秒数),function genUid($type, $serverId){
$prefix = '1.2.3.3680043.19.1944';
$time = gettimeofday();
$random = mt_rand(0, 9999999);
$uid = sprintf(
'%s.%d.%d.%d.%d.%d',
$prefix,
$serverId,
$type,
$time['sec'],
$time['usec'],
$random
);
return $uid;
}
将生成两个值之间的随机整数。通过使用整数,您不需要检查前导零。这样的事可能适合你:
uniqid
请注意,mt_rand
和git gc --prune=now
在您的项目中不是加密安全的。