【发布时间】:2018-02-16 01:21:05
【问题描述】:
我需要创建一个 UID,并且考虑到前几个组件 - 句点之间的部分 (.) - 我创建了一个函数来执行此操作。生成此 UID 的规则是,它不能在组件中包含任何前导零,除非它在它自己的组件中是零。因此:1.2.6.4.0.123.6653 很好,而 1.2.6.4.0123.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。一切看起来都很好,直到我想检查“.00”,在这种情况下,似乎总是只生成一个。
如您所见,如果该函数发现它创建的 UID 与正则表达式 '/.0\d/' 匹配(我也尝试过 '/.0[0-9]/'看看它是否有任何区别,但它没有)但它似乎总是创建不超过一个 UID 不符合 UID 命名规则的 UID。
脚本没有超时(大约需要 5 秒才能完成),所以我有点困惑,为什么函数没有正确调用自身,或者我的正则表达式不正确?恕我直言,它永远不应该创建违反规则的 UID。
谁能给我一些指导,为什么会这样?
【问题讨论】: