关于订单号的生成

2016-08-23 15:45:22 +08:00
 harry890829

现在项目场景是, pc 客户端生成订单号传给后端,之前使用的是微秒级的时间+随机数,但是依旧发生了重复情况,现在想要优化这个算法,要求订单号中只包含数字,长度小于 30 。

后来想到两种方法: 1.YYMMDDhhmmss+mac 地址(转成 18 位十进制),经过讨论, mac 地址可以进行修改,时间也不一定是确定的,假设场景,客户在 12:00 支付完成之后,发现自己时间快了半小时,然后回调了,这样在 11:30 到 12:00 之间就有可能重复。

2.YYYYMMDDhhmiss+毫秒+微秒+IP 尾 4 位+6 位随机数,其中 6 位随机数种子采用( mac 地址前三位前补 00 )与( mac 地址后三位后补 00 )进行异或得出。这个方法大家觉得只是极大的减少的几率问题,但是并不能避免重复的问题

也有同事提到了, guid 来做,但是订单号要求纯数字,现问下如何解决此类问题,多谢 开发语言 c/c++

9086 次点击
所在节点    问与答
63 条回复
jugelizi
2016-08-23 15:56:02 +08:00
客户端。。。大作死啊
harry890829
2016-08-23 15:57:17 +08:00
@jugelizi 哎,现在这个事情已经不可逆了……要是再服务器生成订单号需要修改大量的模块……
loading
2016-08-23 16:00:37 +08:00
Uuid 算法
loading
2016-08-23 16:02:05 +08:00
不用大改吧……入服务器单独设置个接口,申请一个 id 返回,你后面的流程都没变……
egen
2016-08-23 16:02:57 +08:00
你们有 30 个数字, YYMMDDhhmm 长度只有 10 ,后面 20 个全部随机,重复的几率可以忽略,比你加毫秒 mac 什么的重复几率小多了
lincanbin
2016-08-23 16:02:59 +08:00
GUID 从二进制映射到十进制,大概需要 35 位整数,你要求长度小于 30 ,其实已经很接近了。
再多加几位,或者心大点,砍掉 GUID 的几位。
allce231
2016-08-23 16:03:35 +08:00
客户端。。。大作死啊!!!!
egen
2016-08-23 16:04:39 +08:00
因为客户端的时间不可信,记录秒和毫秒也没什么意义
harry890829
2016-08-23 16:05:26 +08:00
@loading 我也想到这个情况,其实我完全可以让服务器开一个接口给我,然后我每次要生成订单号的时候,问服务器要就好了,不过貌似后端不想加这个接口

@egen 这个貌似领导不能接受……

@lincanbin guid 映射到十进制?我去看看,多谢了
qian0206
2016-08-23 16:06:10 +08:00
在服务端弄个接口专门给客户端调用获取订单号不就行了
harry890829
2016-08-23 16:06:36 +08:00
@allce231 都是泪……不知道项目启动的时候为什么这么规划
@egen 是啊,客户端时间不可信, mac 也不是一个可信的值,所以感觉太蛋疼
lincanbin
2016-08-23 16:09:38 +08:00
订单号这种东西你们都敢客户端生成,心很大啊。
lincanbin
2016-08-23 16:17:39 +08:00
@harry890829
噫,我前面算错了, GUID 映射成十进制,是最多需要 39 位整数。

例如说 GUID ,{99D66A96-4CCD-2944-9A3C-9D583513897A},转十进制后就是 204485196726229962288084266002268806444 。

你看着办吧。
loading
2016-08-23 16:20:59 +08:00
如果让后台做个订单 id 的接口都搞不定,你们公司也就玩完了。
xinyewdz
2016-08-23 16:38:25 +08:00
用户 id+时间+随机数。这样还会重复?
terence4444
2016-08-23 16:45:51 +08:00
让客户端提交时检测是不是有重复号码,有的话重新生成一个?
dong3580
2016-08-23 17:08:26 +08:00
@harry890829
客户端怎么改都会有可能有重复,还是服务器端保存那里将收到的订单号运算一下 重新生成一下呀,不就好了,
BuilderQiu
2016-08-23 17:14:18 +08:00
我比较关注价格也是客户端算好传过去的吗?
如果是,分享下客户端下载地址。


然后,客户端生成订单 ID 这种方案是谁批的。。。设计方案讨论能通过。。

治标就各种想办法减少重复数据,治本的办法还是服务器生成,沟通解决吧。
yao978318542
2016-08-23 17:19:31 +08:00
@allce231 你这个头像作大死
allce231
2016-08-23 17:19:59 +08:00
后端判断订单号重复 如果重复重新生成一个 id 给它

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

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

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

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

© 2021 V2EX