php 订单号方案,重复的可能性要很低很低很低,大家说说自己的方案。

2014-10-26 18:23:52 +08:00
 444683462
php订单号方案,重复的可能性要很低很低很低,大家说说自己的方案。
6059 次点击
所在节点    问与答
44 条回复
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;
}
}
young
2014-10-26 22:24:11 +08:00
我是用日期+当天的秒数、毫秒+随机数来的,一般小站差不多
PS:人家是来寻找答案的,怎么某些人就喜欢吓j8BB呢,不得瑟能死吗?
imydou
2014-10-26 22:29:17 +08:00
time() . rand(00000000,99999999)
wzzyj8
2014-10-26 22:55:41 +08:00
@spance PHP开发有PHP开发的玩法,HFT有HFT的玩法,小的初创公司等按照开发HFT系统的模式开发好一套电商程序开门营业,恐怕类似的想法早就被别人占据了先机。
明明是很容易实现的事情真的不懂为什么难实现。各种语言各有所长,何必互相贬低。
iyaozhen
2014-10-26 22:56:36 +08:00
@imydou 如果两个单子时间十分接近,用随机数(随机数并不能保证随机)可能会重复。
wdlth
2014-10-26 23:22:36 +08:00
如果对高并发有要求的话可以由数据库完成全局唯一ID生成,而不是由服务器端语言来。
guoer
2014-10-26 23:55:44 +08:00
私以为要加个校验位
zhengkai
2014-10-27 00:02:08 +08:00
如果的订单量峰值少于 2000条/秒,直接用数据库的自增长就可以了
breeswish
2014-10-27 09:03:41 +08:00
uniqid() 就能确保一定不重复了..
cdffh
2014-10-27 09:23:00 +08:00
uniqid ( time (), true )
Actrace
2014-10-27 09:56:34 +08:00
MYIASM表的自增长,看你怎么冲突....
mgc
2014-10-27 10:08:28 +08:00
@spance 不值得一辩,是不是想说金融高并发都必须用C#开发
macdino
2014-10-27 10:55:55 +08:00
万物的存在,哪就有一定的道理。语言好与不好,不是你一个人说了算滴。各种语言都有各种语方的优缺点,何必一上来就上纲上线的。@spance
fengchang
2014-10-27 10:56:21 +08:00
看到@spance的回复我就惊呆了,拉回去又读了三遍主题
esile
2014-10-27 12:32:36 +08:00
年月日时分秒+随机数
wwek
2014-10-27 14:06:42 +08:00
虽然用uuid uniqid什么的 可以唯一。但是如果我只想纯数字的呢?

多机php负载均衡的情况下呢?
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的
anewg
2014-10-27 14:27:05 +08:00
@wwek 多机的话 uniqid 有 prefix 参数
muziyue
2014-10-27 14:51:08 +08:00
@wwek 数据库自增加工一下就可以啊,而且不会重复,纯数字
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年,觉得应该够了,以后有需求再扩展

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/141637

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX