需求:  1.用户使用,需要可读性好;

2.要满足大量用户的使用,生成的兑换码数据量大;

3.要具备唯一性;

4.不可重复兑换,验证是否兑换使用过要简便;

5.兑换码的规律性不可被轻易猜到,遭到恶性爆刷;

6.算法要高效,保证效率;

可以考虑三种技术:- UUID       - Snowflake   - 自增id;(这三种方式生成的都是数值类型,所以需要转型)

Base64,Base32;

除了字母I、O,数字0、1;我们可使用的就有24个字母和8个数字,也就是32个。

且为了满足可读性,暂定兑换码为10位,也就是10个字符。

0-31角标对应24个字母和8个数字

31=11111

恰好2的五次方为32,将二进制11111转十进制恰好为31

一个字符是为5个bit,十位字符是为50个bit位

UUID需要128位,Snowflake需要64位,都不满足,我们选择自增id

自增id从1增加到Integer的最大值,可以达到40亿以上个数字,而占用的字节仅仅4个字节,也就是32个bit位

使用自增id技术,并用Base32转码加密,即可

这时我们满足了1、2、3个条件;

不可重复兑换解决办法,就是给兑换码一个判断该码是否兑换过,而且验证需要简便

1.兑换码存入数据库中,给兑换码增加一个是否兑换状态的字段,直接读取该字段进行验证

优:简单       缺:对数据库操作频繁,压力大。

2.基于BitMap:跟打卡签到是一样的,判断只有两种状态,0、1;每一个自增id对应一个bit位,而且Redis中的BitMap恰好能支持2的32次方个bit位。4294967296

优:简答、高效、性能好          缺:依赖于Redis

兑换码的规律性不可被轻易猜到,我们自己设计一种算法,模仿参考JWT技术,JWT分为三部分:   Header、Payload、Signature:这个签名是有一个秘钥,结合Header、Payload,利用MD5或者RSA算法生成的。

模拟这种思路

自增id是32个bit位 平均分成8份,每份4个bit位

加权求和,得到的就是签名。也就是用密钥给自增id加密获得签名;

为了防止被猜到密钥,加密规律,我们可以准备16组密钥,也就是4个bit位表达的组号,可以随机,值是多少就是第几组密钥,我称之为新鲜值;

32+4=36,剩下的14位表达签名,不足补0;

14个bit位,11111111111111=16383;

序列号加权运算的秘钥表、在这里存储的密钥明显过于大了,4个bit位转10进制最大15,15*1657=24855

签名14个bit位,0011 1111 1111 1111 = 16383,不够存啊,这怎么解释

他不是直接乘的 后面还有异或操作

拼接:签名 + 新鲜值 + 自增id = 50个bit位,转十进制,就是兑换码。

优惠券兑换码生成算法相关推荐

  1. c#随机数生成编号_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法...

    今天我们来拆解 Snowflake 算法,同时领略百度.美团.腾讯等大厂在全局唯一 ID 服务方面做的设计,接着根据具体需求设计一款全新的全局唯一 ID 生成算法.这还不够,我们会讨论到全局唯一 ID ...

  2. 微信用户全局唯一标识_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法...

    今天我们来拆解 Snowflake 算法,同时领略百度.美团.腾讯等大厂在全局唯一 ID 服务方面做的设计,接着根据具体需求设计一款全新的全局唯一 ID 生成算法.这还不够,我们会讨论到全局唯一 ID ...

  3. snowflake做主键 自增_忘掉 Snowflake,感受一下性能高出 587 倍的全局唯一 ID 生成算法...

    今天我们来拆解 Snowflake 算法,同时领略百度.美团.腾讯等大厂在全局唯一 ID 服务方面做的设计,接着根据具体需求设计一款全新的全局唯一 ID 生成算法.这还不够,我们会讨论到全局唯一 ID ...

  4. mysql序列号生成_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法

    今天我们来拆解 Snowflake 算法,同时领略百度.美团.腾讯等大厂在全局唯一 ID 服务方面做的设计,接着根据具体需求设计一款全新的全局唯一 ID 生成算法.这还不够,我们会讨论到全局唯一 ID ...

  5. 忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法

    今天我们来拆解 Snowflake 算法,同时领略百度.美团.腾讯等大厂在全局唯一 ID 服务方面做的设计,接着根据具体需求设计一款全新的全局唯一 ID 生成算法.这还不够,我们会讨论到全局唯一 ID ...

  6. 美团技术分享:深度解密美团的分布式ID生成算法

    本文来自美团技术团队"照东"的分享,原题<Leaf--美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息I ...

  7. 获取序列全排列Java,java中全排列的生成算法汇总

    全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法 ...

  8. 用python做算法_自己用python写的螺旋矩阵生成算法

    自己用python写的螺旋矩阵生成算法 如果输入6,可以生成如下矩阵: 1 20 19 18 17 16 2 21 32 31 30 15 3 22 33 36 29 14 4 23 34 35 28 ...

  9. 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型...

    from:http://www.freebuf.com/articles/network/139697.html DGA(域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检 ...

最新文章

  1. CentOS7.2中NFS1.3 安装
  2. PS2 KBC will hang
  3. MyBatis的修改数据操作
  4. 分布式一致性算法Raft简介(上)
  5. php识别地址,实现地址自动识别实例(PHP)
  6. android 动态壁纸开发
  7. 月薪3k和30k的程序员,差距就在这道坎...
  8. altium designer快捷键大全
  9. Spark 理论简答
  10. 质量评估指标:SSIM(Structural similarity 结构相似性)
  11. qomo linux最新版本,Qomo Linux下一个版本将推驱动中心
  12. 傅里叶级数与傅里叶变换_Part0_欧拉公式证明+三角函数和差公式证明
  13. 曾经写过得太监小说2《天道》
  14. numpy_10 思维导图
  15. 2.0 正式开始整理一下工训赛(全国大学生工程实践和创新能力大赛),智能垃圾桶的制作流程和参赛历程
  16. C2678 二进制“<“:没有找到接受“ const_Ty“类型的左操作数的运算符
  17. 互联网面试——WPF面试问题
  18. php是舍五入,php四舍php四舍五入五入函数 floor函数、ceil函数、round
  19. 尼尔机械纪元安卓机器人_尼尔机械纪元手机版
  20. 动态站点地图提交百度收录

热门文章

  1. 计算机社团未来发展计划书,电子计算机社团发展计划书.doc
  2. mac安装git的时候踩过的坑
  3. 安装ubuntu docker完整版
  4. NLP基础:编辑距离+拼写纠错实战
  5. 工商银行卡网上查询开户行
  6. iOS UIScreen简介
  7. 波浪谱中用角频率w和频率f表示的区别
  8. 蓝桥杯:外星日历————Python
  9. python3.8安装xlwings_Python操作Excel的Xlwings教程(一)
  10. 原币金额与本币金额的区别