就像电话卡似的,全是数字,不能带字母。
最开始想到是:
N位随机数+数据库一个表的自增id+N位随机数
不想用数据库,想到一个唯一的标准是时间。用时间戳跟上几位随机数。
假如这样生成16的卡号:
时间戳10位+6位随机数
1316651745695261
有时需要一个循环生成多个卡号,一个循环里前面的时间戳(
基本是一样,除非循环里还有其它费时操作),后面的6位随机数无法保证唯一。想到结合microtime
循环调用microtime十次:
0.
80717200 1316675664
0.80720600 1316675664
0.80721300 1316675664
0.80721900 1316675664
0.80722400 1316675664
0.80723000 1316675664
0.80723600 1316675664
0.80724100 1316675664
0.80724600 1316675664
0.80725200 1316675664
我想着是跟上位置在807172这里的数字便于区分开。代码:
for($i=0;$i<10;$i++){
//echo $this->microtime_float();
echo $time = microtime();
$arr = explode(" ",$time);
$micro = $arr[0]*100000000;
$micro_str = substr($micro."",0,6);
$timestamp = $arr[1];
echo "\t".$timestamp."".$micro_str;
echo '<br>';
}
暂时是本地windows下测试不会有重复的,会不会有比较牛X的服务器计算能力猛,微秒也重复了?
另外这样生成的卡号也不好一眼能看出个啥啥的。又不能随意截取其中的几位怕失去了唯一性。不知道有木有好的方法。
比如移动充值卡生成机制?位数少一点的,太多了,人都晕了。。。