php如何生成不重复的卡号

牛逼飞飞 2011-09-22 03:44:29
就像电话卡似的,全是数字,不能带字母。

最开始想到是:

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的服务器计算能力猛,微秒也重复了?

另外这样生成的卡号也不好一眼能看出个啥啥的。又不能随意截取其中的几位怕失去了唯一性。不知道有木有好的方法。
比如移动充值卡生成机制?位数少一点的,太多了,人都晕了。。。
...全文
856 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
kunloon 2011-10-10
  • 打赏
  • 举报
回复
PHP uniqid() 函数 吧,能满足你的需求

http://www.w3school.com.cn/php/func_misc_uniqid.asp
xuzuning 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ci1699 的回复:]

微秒+随机5位。绝对不重复。
[/Quote]从理论上就说不过去
ci1699 2011-10-10
  • 打赏
  • 举报
回复
微秒+随机5位。绝对不重复。
bdzj64420 2011-10-10
  • 打赏
  • 举报
回复
建议用缓存处理 这样速度快
士元 2011-09-30
  • 打赏
  • 举报
回复
建议用DB来生成这种唯一ID号,
DB的验证和锁机制等比较完善,
真正用的时候必然是走这种模式,自己再实现一个自增ID 不是不行,而是有太多意外
ZT_King 2011-09-30
  • 打赏
  • 举报
回复
即使生成出来的数据是唯一,难道你就不需要进行校验?
何况你还不能确保数据永远唯一,所以还是进行查询校验吧.
火光闪耀 2011-09-28
  • 打赏
  • 举报
回复
现在的CPU速度太快了,微秒是有可能重复的
spliendid 2011-09-28
  • 打赏
  • 举报
回复
可以用了~~
阡陌红茶 2011-09-28
  • 打赏
  • 举报
回复
支持时间戳 +id(唯一)
牛逼飞飞 2011-09-28
  • 打赏
  • 举报
回复
亲们,数据表自增id位数会不断扩大。直接用时间戳加毫秒级的也可以。但是时间戳生成的 看起来都一样的。。。
autumnkiller 2011-09-23
  • 打赏
  • 举报
回复
如果只用 时间戳(可重复)+随机数(可重复) 这样的话,是不能保证100%没冲突的......
建议:时间戳(可能重复)+随机数(可能重复)+数据库id或其它唯一值(唯一) 才能得到不重复的结果。
shupo 2011-09-23
  • 打赏
  • 举报
回复
不重复
毅浮华 2011-09-22
  • 打赏
  • 举报
回复
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>';
}



黑色渐变 2011-09-22
  • 打赏
  • 举报
回复
不重复,直接依次排下去好了,为什么一定要随机?
y75674952 2011-09-22
  • 打赏
  • 举报
回复
time()+随即3未数+(随机3位数+1)

这样应该不会重复了....

时间戳每天+3位随机数+后面的随即数+i

或者 . 随机数2+time()+随机数4
WaistCoat08 2011-09-22
  • 打赏
  • 举报
回复
微秒数重复的可能性不大,况且你后面还有随机数,如果你不确定还可以增加usleep(1)等待下。

但如果服务器修改时间你就没法保证微秒数不重复了。

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧