随机生成优惠券充值卡点卡银行卡账号及密码

使用php写,其它语言可以参考思路

我的机器生成10万条数据,一秒都不到

  1. 第一个方法,生成随机卡号,卡号前缀自定义,这里使用的是时间戳做为前缀
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;
}
  1. 第二个方法,是批量生成卡号
    这个方法里面有一个统计去除重复的卡号后,最终有几个符合条件的卡号,以及生成耗时的值,不需要可以去掉
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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值