前阵子,公司有个电子商务项目,须要生成订单号。
当时的考虑很简单,取系统时间加上随机数,或者使用 uniqid() 方法。
咱们都知道,订单号最基本的要求就是惟一,这个条件必须知足。仔细考虑下上述方法,在顾客购买量少的状况下,订单重复的可能性为零,可是在购买高蜂期生成的订单号重复是颇有可能发生的。因此上述方法不可靠,有待强化。
在网上找了一番,发现这位同窗的想法挺不错的,redtamo,具体的请稳步过去看看,我做简要概述,该方法用上了英文字母、年月日、Unix 时间戳和微秒数、随机数,重复的可能性大大下降,仍是很不错的。使用字母颇有表明性,一个字母对应一个年份,总共16位,很少也很多,呵呵。php
<?php $yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'); $orderSn = $yCode[intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99)); ?>
订单号规则:数据库
订单命名的几种规则:
一、不重复。
这点我相信你们都懂,订单的惟一性不用解释。
二、安全性。
你的订单编号不能透露你公司的真实运营信息,好比你的订单就是流水号的话,那么别人就能够从订单号推测出你公司的总体运营归纳了。因此订单编码必须是除了大家公司少部分人外,其余人基本看不懂的。参考京东和淘宝的编码规则,基本别人是搞不清是什么意思的。
其实最好的防泄漏编码规则就是在编码中不要加入任何和公司运营的数据。
三、不能使用大规模随机码。
不少人分析订单编码规则的时候,第一个念头确定是不重复惟一性,那么第二个念头可能就是安全性,那么同时知足前二者的第三个念头就是随机码了。由于大规模的随机码随机生成,由于自己就没有意义因此无所谓泄密了。可是事实上这种编码规则在实现上会有很大问题的。
随机码知足第二点安全性要求,为了知足第一点不重复特性,那就得在生成随机码的时候对比历史数据是否有重复,若是你的订单数量到达了十万次,你每次生成订单编码时就得对比十万条历史数据,你可想而知会形成什么巨大问题。
可是难道随机码就不能在编码中使用了吗?小规模的随机码是可使用的,好比2~3位,这种随机码通常都是和流水号等结合使用,主要做用是为了隐藏流水号的真实数据而进行使用的。
PS:在这里感谢 @马驰@dad ni @bao xu(这个不知道为什么@不到)同窗的讨论,马驰同窗实际测试估算了生成随机码而且检测重复所花费的时间在纳秒级别。可是我仍是保持原来观点,以为这种生成规则存在方向性问题,可能会形成检测时间过长的问题出现。
但愿你们积极参与讨论。
四、防止并发。
这条规则主要针对编码中有时间的设定。
五、控制位数。
这点很好理解,订单号的做用就是便于查询。
通常正常使用场景应该是订单出异状或者退货的时候,用户将订单号报给客服,由客服进行查询。
因此通常在10~15位为好。
京东10位,淘宝15位。
推荐的几种编码规则:
年月日时分秒+用户ID(命名用户ID时也要注意,不要用流水号。能够采用区域ID+随机码+流水号+随机码方式)
一、惟一性:时间是单向的,确保惟一性。
二、安全性:确保用户ID安全便可。
三、随机码不参与判断,由于以前数据已确保无重复。
四、在同1秒钟,同一用户是不会产生2个订单编码的,因此能够防并发。
五、位数可能会在20位以内,位数比较多。
年月日时分秒微秒+随机码(2)+流水号+随机码(3)
一、惟一性:时间是单向的,确保惟一性。
二、安全性:确保流水号不会识别出便可。
三、随机码的位数和先后都是保密的,因此若是不清楚这一点的话,是很难判断出流水号的位数的。由于同时产生的订单数量不少,编码不具有线性对比功能。就算知道了流水号,能够在初始化时进行赋值。
四、在同1秒钟,同一用户是不会产生2个订单编码的,因此能够防并发。
五、位数可能会在20位以内,位数比较多。
(以上来自知乎@benben)
==============================================
订单号常见的几种方式:
1.利用数据库主键值产生一个自增加的订单号(订单号即数据表的主键)
2.日期+自增加数字的订单号(好比:2012040110235662)
3.产生随机的订单号(65865325365966)
4.字母+数字字符串式,字母有包含特别意义,C02356652
订单号设计原则: 按需设计
用来检索订单详细信息的惟一特征码,能够利用订单号检索到下单日期、产品类别、颜色、尺码(或款式)、仓位等信息,订单号包含过多的信息有点“多此一举”的意味!只要按需设计便可!
订单号设计用户体验规则:
1.订单号无重复性;
2.若是方便客服的话,最好是“日期+自增数”样式的订单号,客服一看便知道订单是否在退货保障期限内容;
3.订单号长度尽可能保持短(10位之内),方便用户,尤为电话投诉时,长的号码报错概率高,影响客服效率;
4.订单号尽可能保持数字型(纯整数),在数据库订单索引查询中,长整数字型的数据索引与检索效率,远远高于文本型,所以尽可能避免“字母+数字字符串式”!安全