使用php写,其它语言可以参考思路
我的机器生成10万条数据,一秒都不到
- 第一个方法,生成随机卡号,卡号前缀自定义,这里使用的是时间戳做为前缀
public function randCardNum($bit = 4)
{
if ($bit < 1) {
return FALSE;
}
$chars = '1234567890ABCDEFGHJKLMNPQRSTUVWXYZ';//我这里去掉了I和O两个容易和数字混在一起的字母
$randnum = '';
for ( $i = 0; $i < $bit; $i++ )
{
if ($i == 4 || $i == 8 || $i == 12) {
$randnum .= "-";//每四位卡号,增加一个分隔号,此处设为中间横杠,也可以自己设置为五位,或去掉这个if
}
$randnum .= $chars[mt_rand(0, strlen($chars)-1)];
}
return strtoupper(base_convert(time() - 1562860656, 10, 36)) .'-' . $randnum;
}
- 第二个方法,是批量生成卡号
这个方法里面有一个统计去除重复的卡号后,最终有几个符合条件的卡号,以及生成耗时的值,不需要可以去掉
public function cardArray($num = 1000, $bit = 12)
{
if ($num < 1 && $bit < 1) {
return FALSE;
}
$v1['count'] = '';
$v1['time'] = '';
$t1 = microtime(true);
for ( $i = 0; $i < $num; $i++ ){
$v1[$i] = $this->randCardNum($bit);
}
$unique_arr = array_filter(array_unique($v1));//去除数组的空值项,重复项
$unique_arr['count'] = '总数:' . count($unique_arr) . '个';
$t2 = microtime(true);
$t = $t2 - $t1;
$unique_arr['time'] = '总耗时:' . $t;
return $unique_arr;
}
3.第三个方法,第一个方法中的前缀使用的是php自带的36进制,这里提供一个自定义进制转化方法
public function decb64($dec) { //10进制转换成N进制;
$chars = '1234567890ABCDEFGHJKLMNPQRSTUVWXYZ';//我这里去掉了I和O两个容易和数字混在一起的字母
if ($dec < 0) {
return FALSE;
}
$map = str_split($chars);//字符串转成数组
$maxlength = count($map);//统计数组总数,有几个就是几进制
$b64 = '';
do {
$b64 = $map[($dec % $maxlength)] . $b64;
$dec /= $maxlength;
} while ($dec >= 1);
return $b64;
}
为了防止生成的卡号重复,可以一次生成比指定数量更多的卡号,比如本来要生成10万条,现在生成20万,最后取前面不重复的10万条就可以
这个重复的概率已经很低了,
以下为什么都不要的代码
public function randCardNum($bit = 4)
{
if ($bit < 1) {
return FALSE;
}
$chars = '1234567890ABCDEFGHJKLMNPQRSTUVWXYZ';
$randnum = '';
for ( $i = 0; $i < $bit; $i++ )
{
$randnum .= $chars[mt_rand(0, strlen($chars)-1)];
}
return strtoupper(base_convert(time() - 1562860656, 10, 36)) .'-' . $randnum;
}
public function cardArray($num = 1000, $bit = 12)
{
if ($num < 1 && $bit < 1) {
return FALSE;
}
$v[] = '';
for ( $i = 0; $i < $num; $i++ ){
$v1[$i] = $this->randCardNum($bit);
}
$unique_arr = array_filter(array_unique($v1));//去除数组的空值项,重复项
return $unique_arr;
}