订单号生成规则

前阵子,公司有个电子商务项目,需要生成订单号。
当时的考虑很简单,取系统时间加上随机数,或者使用 uniqid() 方法。
我们都知道,订单号最基本的要求就是唯一,这个条件必须满足。仔细考虑下上述方法,在顾客购买量少的情况下,订单重复的可能性为零,但是在购买高蜂期生成的订单号重复是很有可能发生的。所以上述方法不可靠,有待强化。
在网上找了一番,发现这位同学的想法挺不错的,redtamo,具体的请稳步过去看看,我作简要概述,该方法用上了英文字母、年月日、Unix 时间戳和微秒数、随机数,重复的可能性大大降低,还是很不错的。使用字母很有代表性,一个字母对应一个年份,总共16位,不多也不少,呵呵。

<?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));
?>

订单号规则:

订单命名的几种规则:
1、不重复。
这点我相信大家都懂,订单的唯一性不用解释。
2、安全性。
你的订单编号不能透露你公司的真实运营信息,比如你的订单就是流水号的话,那么别人就可以从订单号推测出你公司的整体运营概括了。所以订单编码必须是除了你们公司少部分人外,其他人基本看不懂的。参考京东和淘宝的编码规则,基本别人是搞不清是什么意思的。
其实最好的防泄漏编码规则就是在编码中不要加入任何和公司运营的数据。
3、不能使用大规模随机码。
很多人分析订单编码规则的时候,第一个念头肯定是不重复唯一性,那么第二个念头可能就是安全性,那么同时满足前两者的第三个念头就是随机码了。因为大规模的随机码随机生成,因为本身就没有意义所以无所谓泄密了。但是事实上这种编码规则在实现上会有很大问题的。
随机码满足第二点安全性要求,为了满足第一点不重复特性,那就得在生成随机码的时候对比历史数据是否有重复,如果你的订单数量到达了十万次,你每次生成订单编码时就得对比十万条历史数据,你可想而知会造成什么巨大问题。
但是难道随机码就不能在编码中使用了吗?小规模的随机码是可以使用的,比如2~3位,这种随机码一般都是和流水号等结合使用,主要作用是为了隐藏流水号的真实数据而进行使用的。
PS:在这里感谢 @马驰@dad ni @bao xu(这个不知道为何@不到)同学的讨论,马驰同学实际测试估算了生成随机码并且检测重复所花费的时间在纳秒级别。但是我还是保持原来观点,觉得这种生成规则存在方向性问题,可能会造成检测时间过长的问题出现。
希望大家积极参与讨论。
4、防止并发。
这条规则主要针对编码中有时间的设定。
5、控制位数。
这点很好理解,订单号的作用就是便于查询。
一般正常使用场景应该是订单出异状或者退货的时候,用户将订单号报给客服,由客服进行查询。
所以一般在10~15位为好。
京东10位,淘宝15位。
推荐的几种编码规则:
年月日时分秒+用户ID(命名用户ID时也要注意,不要用流水号。可以采用区域ID+随机码+流水号+随机码方式)
1、唯一性:时间是单向的,确保唯一性。
2、安全性:确保用户ID安全即可。
3、随机码不参与判断,因为之前数据已确保无重复。
4、在同1秒钟,同一用户是不会产生2个订单编码的,所以可以防并发。
5、位数可能会在20位之内,位数比较多。
年月日时分秒微秒+随机码(2)+流水号+随机码(3)
1、唯一性:时间是单向的,确保唯一性。
2、安全性:确保流水号不会识别出即可。
3、随机码的位数和前后都是保密的,所以如果不清楚这一点的话,是很难判断出流水号的位数的。因为同时产生的订单数量很多,编码不具备线性对比功能。就算知道了流水号,可以在初始化时进行赋值。
4、在同1秒钟,同一用户是不会产生2个订单编码的,所以可以防并发。
5、位数可能会在20位之内,位数比较多。
(以上来自知乎@benben)
==============================================
订单号常见的几种方式:
1.利用数据库主键值产生一个自增长的订单号(订单号即数据表的主键)
2.日期+自增长数字的订单号(比如:2012040110235662)
3.产生随机的订单号(65865325365966)
4.字母+数字字符串式,字母有包含特别意义,C02356652
订单号设计原则: 按需设计
  用来检索订单详细信息的唯一特征码,可以利用订单号检索到下单日期、产品类别、颜色、尺码(或款式)、仓位等信息,订单号包含过多的信息有点“画蛇添足”的意味!只要按需设计即可!
订单号设计用户体验规则:
1.订单号无重复性;
2.如果方便客服的话,最好是“日期+自增数”样式的订单号,客服一看便知道订单是否在退货保障期限内容;
3.订单号长度尽量保持短(10位以内),方便用户,尤其电话投诉时,长的号码报错几率高,影响客服效率;
4.订单号尽量保持数字型(纯整数),在数据库订单索引查询中,长整数字型的数据索引与检索效率,远远高于文本型,因此尽量避免“字母+数字字符串式”!

时间: 2024-08-05 07:01:33

订单号生成规则的相关文章

不重复订单号生成规则

偶尔在网上看到的,相对比较好的c#端订单号生成规则 public class BillNumberBuilder{ private static object locker = new object(); private static int sn = 0; public static string NextBillNumber(){ lock(locker){ if(sn == 9999999999) sn = 0; else sn++; return DateTime.Now.ToStrin

项目笔记之订单号生成规则以及方法,第一篇!

小伙伴们在日常的商城项目开发中,都会遇到订单号生成的问题,今天呢小编就带领大家去解读一下生成订单号的问题! 首先,订单号我们要明确它有有3个性质:1.唯一性 2.不可推测性3.效率性,唯一性和不可推测性不用说了,效率性是指不能频繁的去数据库查询以避免重复.况且满足这些条件的同时订单号还要足够的短.不知道小伙伴们在日常的项目中是否也和我一样去思考过生成订单的一些小问题,可能你也会说,这些东西不用想的那么复杂,其实呢,小编也是同意大家的看法,但是殊不知我们做程序的都讲究严谨性,而且在订单模块的开发中

订单号生成规则,谁用谁知道

1 class Program 2 { 3 //订单号数据源,实际项目中,这里是从数据库中读取过来的 4 string[] strList = { "201512000001", "201512000002", "201512000003", "201512000004", 5 "201512000008", "201512000007", "201512000006"

偶尔在网上看到的,相对比较好的c#端订单号生成规则

public class BillNumberBuilder{     private static object locker = new object();            private static int sn = 0;            public static string NextBillNumber(){         lock(locker){             if(sn == 999999999)                 sn = 0;    

c#唯一订单号生成代码

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string uniqueNum = GenerateOrderNumber(); Console.WriteLin

订单号生成办法

1.Redis Incr public class RedisConnection { private static readonly ConfigurationOptions ConfigurationOptions = ConfigurationOptions.Parse("127.0.0.1" + ":" + "6379"); private static ConnectionMultiplexer _redisConn; private

如何生成不重复的订单号?这里提供一个不重复订单号生成方法

最近老是被运营抱怨订单号太长不方便输入,可是如果随机生成太短的订单号又容易重复,造成客户提交订单失败. 夜不能眠下写了这个工具,完美解决了问题,在这里分享下,由于时间紧张考虑可能不太周到,如发现问题欢迎指教. import java.util.Collections; import java.util.HashSet; import java.util.Set; /** * 订单号生成器 */ public class OrderNoGenerator { private int size; p

python实现 - 模拟贷款卡号生成规则

笔者在测试某web系统的过程中,需要用到“贷款卡号”,且此贷款卡号仅能使用一次,保存过后下一次无法再次使用相同的卡号. 遂决定依据它的生成规则,自己写一段代码来实现. 同时为了方便起见,贷款卡的前三位默认用数字来实现. 1. 生成规则如下: 贷款卡编码一共有16位,最后两位是校验位 整个贷款卡编码的规则如下: 前三位:分别为数字或者大写英文字母 第四位到第十四位:分别为数字 后两位的校验码为 前十四位乘以权重相加后除以97后的余数再加1后得到的数字, 如果此数字为个位数,前面还需要补一个零 前十

订单号生成

var date=['J','F','C','D','E','B','H','I','A'];//console.log((new Date().getTime()).toString());var orderSN = date[(new Date().getFullYear()) - 2015];//console.log(orderSN);var a001 =(new Date().getMonth()+1).toString(16).toUpperCase();//console.log(