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

背景:

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

最初的想法:

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

进一步的优化:

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

posted @ 2017-03-31 10:55  xuanbg  阅读(677)  评论(0编辑  收藏  举报