zoukankan      html  css  js  c++  java
  • 一个完全平均分布的固定长度随机数发生器

    背景:

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

    最初的想法:

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

    进一步的优化:

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

  • 相关阅读:
    python3数据库配置,远程连接mysql服务器
    Ubuntu 16.04安装JDK
    用Python从零开始创建区块链
    理解奇异值分解SVD和潜在语义索引LSI(Latent Semantic Indexing)
    gensim介绍(翻译)
    记一次浅拷贝的错误
    Heap queue algorithm
    Python
    python列表中插入字符串使用+号
    Linux(Ubuntu)使用 sudo apt-get install 命令安装软件的目录在哪?
  • 原文地址:https://www.cnblogs.com/xuanbg/p/6650150.html
Copyright © 2011-2022 走看看