nodejs如何实现每次生成4位不重复随机字符?

现在有一个生成优惠码的需求,产品要求长度压缩到4位,开发环境是nodejs + mysql,有什么好的方案可以保证每次生成的4位随机码跟之前的都不重复呢?

阅读 5.3k
3 个回答

直观的想法是通过10个数字(0-9) + 26个小写字母(a-z)排列组合实现,也就是可以有36的4次幂 = 1679616种组合,完全可以满足一个小型项目的需求。如果项目比较大,完全可以通过加入其他项(比如特殊字符、大写字母等等)到可择列表实现,最终还可以提升邀请码位数进一步扩展。
实现步骤:

  1. 首先要确定随机数的依据,采用递增数字(可以对应数据库id)作为基础,创建随机串。
  2. 打乱10个数字 + 26个字母的组合,这样随机数看起来会舒服一些。
  3. 把四位数字的每一位作为下标对应打乱后10个数字 + 26个字母的组合的列表。
  4. 组合成4位唯一随机字符串。

缺点:

  • 基数数字低于36无法创建,比如起始数字大于36。
  • 有一定规律性,容易被推测。
  • 两次操作数据库,影响效率。

欢迎大家提出高效思路,不足之处请指出。

  • 1.给优惠码字段添加唯一索引。
  • 2.每次新生成的优惠码,尝试插入数据库,

    • 插入成功,就将优惠码返回到页面。
    • 插入失败,重新生成,并尝试插入数据库。
新手上路,请多包涵

只为交差的话,随机取个数字开始递增或者递减,然后建个字典替换字符,额……就是扛不住风险,有心一眼能看出来。

想提高安全性的话,可以切换步数。比如(原始码)上个1111,下个1113,下下个1120。

还想安全点(也不嫌麻烦)的话,就用双轨的步数切换吧。比如上个1111,到了1120,跳到2111,到了2120,跳回去1121。当然不止双轨,三轨四轨也可以——这是这样没必要,真想要安全性,就老实点用正经的对称加密算法吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题