关于订单号的生成

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++

9101 次点击
所在节点    问与答
63 条回复
SlipStupig
2016-08-24 14:06:44 +08:00
如果是单纯冲突的话转成 MD5 或者 SHA1 转一下,如果是破解,只能用 VMProtect 这类软件延缓一下,基本上在客户端是挡不住的
harry890829
2016-08-24 14:23:16 +08:00
@sc3263 这个方法比较好,我也向领导反映了这个方案
@dong3580 服务器发现重复直接拒绝,前端重新发起就好
@scnace 用户 id 重复的
@flyingfz 多谢,没想到汤不热上也有技术性文章……
harry890829
2016-08-24 14:23:35 +08:00
上面各位不一一回复了,在这里感谢大家给出的建议……

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

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

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

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

© 2021 V2EX