1
abelyao 2014-10-26 18:53:00 +08:00
有长度要求吗?有排序要求吗?纯数字还说可英文?并发量估计会去到多少?
|
2
bystand3r 2014-10-26 19:14:58 +08:00
同楼上……你的格式要求呢……给你来个1024位的?
|
3
sy1989 2014-10-26 19:37:29 +08:00
mysql 的自增好了
|
5
vibbow 2014-10-26 19:47:15 +08:00
用 UUID
|
6
imn1 2014-10-26 19:47:15 +08:00
类别+时间+随机数
|
7
yylzcom 2014-10-26 19:51:01 +08:00
timestamp+userid(+random number)
|
8
xiaoyaoking 2014-10-26 19:54:34 +08:00
7 楼正解, 其实 timestamp 就不会重复了。。 想要长度就 timestamp md5 妥妥的。
|
9
orvice 2014-10-26 19:57:45 +08:00
时间(精确到秒)+随机数基本就可以了吧
|
10
spance 2014-10-26 20:00:11 +08:00
PHP很难做到。
不要为了一个没有前景的语言徒劳奔命。更何况,php还不能算是一个完整的语言。 首先,语言层面就没有线程、锁、信号量、原子CAS等等这些很基本的东西,更缺乏体系规范,php5开始搞伪伪伪面向对象,学不像更鸡肋,还有那么多对C函数的简单包装。。。 除了最近本CRUD外,稍微复杂的业务逻辑or业务系统是没法用php实现的。除了搞搞简单页面输出,真看不出这玩意还有啥难能可贵的地方。 不要在本就不长的人生路上浪费时间。 |
12
barbery 2014-10-26 20:13:11 +08:00
mysql主键自增 或者redis counter
|
13
aveline 2014-10-26 20:24:34 +08:00
uniqid()
|
14
lch21 2014-10-26 21:37:43 +08:00
uniqid() +1
|
15
xoxo 2014-10-26 21:40:20 +08:00
md5( auto_increament_id + salt );
|
16
anewg 2014-10-26 21:41:09 +08:00 3
@spance 你也是挺逗的,人家来求解决业务需求,你来给人家人生忠告。一个 uniqid() 就解决的事,难不成让他跟老板说“没有信号量、原子CAS很难做到,不要在本就不长的人生路上浪费时间,老板我们换个语言不?”
|
17
xoxo 2014-10-26 21:42:14 +08:00
@xoxo by the way, https://sslcertificate.cn的系统就是采用 md5( auto_increament_id + salt ) 的方式,其它既然不能猜到使用量,也不防止了碰撞
|
18
spance 2014-10-26 21:52:47 +08:00
|
20
curiousjude 2014-10-26 22:05:22 +08:00 2
@spance 那你倒是说说解决方案啊。你这种答案说得好听叫没有帮助,说得不好听叫制造噪音。
|
21
zts1993 2014-10-26 22:16:41 +08:00
/**
* 生成UUID * @return string */ function gen_uuid() { if (function_exists('com_create_guid')) { return com_create_guid(); } else { mt_srand((double)microtime() * 10000); //optional for php 4.2.0 and up. $char_id = strtoupper(md5(uniqid(rand(), true))); $hyphen = chr(45); // "-" $uuid = chr(123) // "{" . substr($char_id, 0, 8) . $hyphen . substr($char_id, 8, 4) . $hyphen . substr($char_id, 12, 4) . $hyphen . substr($char_id, 16, 4) . $hyphen . substr($char_id, 20, 12) . chr(125); // "}" return $uuid; } } |
22
young 2014-10-26 22:24:11 +08:00 via iPhone
我是用日期+当天的秒数、毫秒+随机数来的,一般小站差不多
PS:人家是来寻找答案的,怎么某些人就喜欢吓j8BB呢,不得瑟能死吗? |
23
imydou 2014-10-26 22:29:17 +08:00
time() . rand(00000000,99999999)
|
24
wzzyj8 2014-10-26 22:55:41 +08:00 1
@spance PHP开发有PHP开发的玩法,HFT有HFT的玩法,小的初创公司等按照开发HFT系统的模式开发好一套电商程序开门营业,恐怕类似的想法早就被别人占据了先机。
明明是很容易实现的事情真的不懂为什么难实现。各种语言各有所长,何必互相贬低。 |
26
wdlth 2014-10-26 23:22:36 +08:00
如果对高并发有要求的话可以由数据库完成全局唯一ID生成,而不是由服务器端语言来。
|
27
guoer 2014-10-26 23:55:44 +08:00
私以为要加个校验位
|
28
zhengkai 2014-10-27 00:02:08 +08:00
如果的订单量峰值少于 2000条/秒,直接用数据库的自增长就可以了
|
29
breeswish 2014-10-27 09:03:41 +08:00
uniqid() 就能确保一定不重复了..
|
30
cdffh 2014-10-27 09:23:00 +08:00
uniqid ( time (), true )
|
31
Actrace 2014-10-27 09:56:34 +08:00
MYIASM表的自增长,看你怎么冲突....
|
33
macdino 2014-10-27 10:55:55 +08:00
万物的存在,哪就有一定的道理。语言好与不好,不是你一个人说了算滴。各种语言都有各种语方的优缺点,何必一上来就上纲上线的。@spance
|
35
esile 2014-10-27 12:32:36 +08:00
年月日时分秒+随机数
|
36
wwek 2014-10-27 14:06:42 +08:00
虽然用uuid uniqid什么的 可以唯一。但是如果我只想纯数字的呢?
多机php负载均衡的情况下呢? |
37
wwek 2014-10-27 14:14:35 +08:00
/**
* 得到新订单号 * @return string */ function get_order_sn() { /* 选择一个随机的方案 */ mt_srand((double) microtime() * 1000000); return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); } 这是 ecshop的 |
40
bystand3r 2014-10-27 15:23:33 +08:00
/**
* 生成16位纯数字订单号 * 最大支持时间到 2056-12-31 23:59:59 * * @access public * @return string */ public static function getOrderSN() { return (date('y') + date('m') + date('d')) . str_pad((time() - strtotime(date('Y-m-d'))), 5, 0, STR_PAD_LEFT) . substr(microtime(), 2, 6) . sprintf('%03d', rand(0, 999)); } 目前在用的,基本保证不重复了,能用到2056年,觉得应该够了,以后有需求再扩展 |
42
jevonszmx 2014-10-27 18:24:59 +08:00
其实参考成熟的方案就可以看出一般做法了
比如淘宝的订单号839175861614813 最后四位同一个用户一定是一样的 前面如果可以用字符串的话可以使用日期(方便分类和追溯)+ 类型id + 订单id,再加上进制转换,可以实现很大的数量级; 订单id,如果觉得php无法实现原子性,可以使用mysql、redis等,完全没问题啊。 |
44
dong3580 2014-11-02 18:00:23 +08:00
GUID,或者时间戳,或者增量种子生成。
|