碰到个需求:预生成唯一码
要存数据库,使用唯一索引
唯一码需要随机生成
这里我利用了自增id,首先初始化一个固定的起始值initNumber
,然后每次生成的时候从数据库中取出当前有多少个唯一码totalNum
,最后是需要生成唯一码的数量count
我就测了单表2000w条数据没问题
$initNumber = 123456789;
$totalNum = 10000; // 数据库查询获得
$count = 8888; //需要生成的唯一码数量,用户输入
for ($i = 0; $i < $count; $i++){
caseNum($initNumber + $i + $count);
}
代码如下
function caseNum(string $str): string
{
$arr1 = [5, 1, 3, 4, 9, 6, 7, 2, 8, 0];
$arr2 = [0, 4, 3, 2, 7, 1, 8, 9, 6, 5];
$arr3 = [9, 6, 3, 2, 8, 7, 4, 0, 5, 1];
$arr4 = [2, 6, 5, 9, 7, 8, 4, 0, 3, 1];
$arr5 = [6, 9, 3, 2, 0, 8, 4, 7, 5, 1];
$newStr = '';
for ($i = 0; $i < 9; $i++) {
$flag = ((int) $str[$i] + (int) $str[8]) % 10;
switch ($i) {
case 0:
case 1:
$newStr .= $arr1[$flag];
break;
case 2:
case 3:
$newStr .= $arr2[$flag];
break;
case 4:
case 5:
$newStr .= $arr3[$flag];
break;
case 6:
case 7:
$newStr .= $arr4[$flag];
break;
case 8:
$newStr .= $arr5[$flag];
}
}
return $newStr;
}
害,后面又改了一版
function caseNum(int $number, int $index): int
{
$arr = [
[1, 1, 2, 3, 5],
[2, 3, 5, 7, 11],
[1, 3, 5, 7, 9],
[2, 4, 6, 8, 10],
];
$index %= count($arr[0]);
$random = random_int(1, 25) % 4 ;
$number += $arr[$random][$index];
return $number;
}