一个完全平均分布的固定长度随机数发生器

本文探讨了一种订单号生成策略,采用日期加加密流水号的方式确保唯一性和安全性,并提出使用循环链表来管理流水号,避免重复和服务重启带来的问题。

背景:

订单需要一个不重复且加密的的订单号,而且订单号不能太长!加密说白了就是不想让任何人从订单号中看出来今天产生了多少个订单。订单号要不重复且不太长,那就只能是日期+流水号。但是,流水号显然不能符合加密的需求。所以,流水号就需要加密了。

最初的想法:

初始化一个顺序序列的map,然后随机取出一个数放到一个栈里面并删除map里面的元素,直到把map取空为止。这样,就得到了一个包含完全正态分布的随机数序列的栈。生成一个订单就从栈里面弹出一个作为流水号。这个方案在持久化上比较难处理,所以最终被放弃了。至于为什么要持久化,其实很简单,你总不能指望这个系统永远正常工作吧?一旦重启,就可能产生重复的流水号。

进一步的优化:

初始化一个顺序序列的map,然后随机取出一个数放到一个循环链表里面并删除map里面的元素,直到把map取空为止。这个方案的好处是可以用较低的成本进行初始化和持久化。因为这个序列可以循环使用,所以只需要保存一次序列就可以了。使用的时候,只要取出下一个节点的值作为流水号,然后每过1000个节点保存一次当前节点,服务重启后取保存的当前节点后1000个节点作为当前节点,就不虞流水重复了。

转载于:https://www.cnblogs.com/xuanbg/p/6650150.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值