最近做一个直播视频app源码的邀请码功能,一直没找到感觉很完美的方法,然后自己造了一个轮子,当然效果还不是很完善。
首先我认为直播视频app源码的邀请码需要有以下特性:
1、唯一性,不能出现两个场景下生成一样的邀请码。
2、不规律性,至少在字面上不能猜出规律来。
3、高效性,生成邀请码的算法不能太过复杂,或者太消耗性能。
思路:
理论上用时间戳生成的数字串基本上是唯一的,如果经过一定规则的打乱顺序,然后进行字母映射的话,字面上的规律还是不怎么可能直接看出来的。但是时间戳有一个不好的地方,就是长度太长了,当前我想要使用的场景下,邀请码推荐是生成6位的,6位用完了才会去使用更长的。此外,对于长度短的随机算法,出现冲突,去重的过程不管从空间上还是时间上去解决都一定程度上消耗性能。
所以,我希望找到一个算法,能每次都直接生成长度优先在6位,而且唯一的邀请码。
当然,凭空直接生成邀请码肯定会冲突,生成邀请码这里可以输入一个唯一的依据。比如说,我使用了当前是第几个邀请码。
这样就类似于,y=f(x),输入的x是整数序列1、2、3、4......,输出的y是一段优先为6位的邀请码。但是f函数的映射不是事先生成好的,这样的话会占空间,这里希望是在线生成。
步骤:
网上找了一些很好的混淆规律的点,比如:数字转36进制包含字母的串(然后把36进制中映射的字母和数字顺序打乱)、数字顺序按照一定规则打乱等。于是我按照了以下步骤生成邀请码。
步骤一(打乱数字顺序):首先输入的序列x是唯一的,假设我的邀请码最短长度MIN_LENGTH是6,那么我先把x转成长度至少为6的数字串,不足6位的高位补0。然后,对低6位按照一定规则进行打乱,比如固定的交换第4位和第5位,然后交换第1位和第3位等。让再次生成的数字串不是连续的。(当然此处的打乱长度可以不一定是6位,但是邀请码是6位的话,数字串6位长度不会超过邀请码的长度)
步骤二(32进制乱序编码):由步骤一生成的乱序数字串进行32进制乱序编码,为什么选取32进制?因为保留了a、b、c、d四个字母在后续步骤中做随机补全。乱序编码表比如:
code_map = [
'e', '0',
'f', 'g', '6',
'h', 'i', 'j', 'k', '9',
'l', '3',
'm', 'n', 'o', 'p', 'q', 'r', '1',
's', 't', '7',
'u', 'v', 'w', '8',
'x', '2',
'y', '4',
'z', '5'
]
在十进制中数字p,会映射成字符code_map[p],这样进行乱序编码后,生成了字符串s。
步骤三(随机补全):因为步骤二保留了a、b、c、d四个关键字母,而且生成的字符串s不一定达到了MIN_LENGTH长度6。那么就用关键字母补全剩余的位数,而且是随机选取补全到字符串中的随机位置。最终生成长度优先为6位的邀请码。(后续x越大的时候,邀请码会超过6位,但是基本上高位可能会基本上某段区间是一样的,不过规律还是比较不明显的)
实践:
比如我某次生成的直播视频app源码邀请码:
daa6gb
kabaci
ddmc9c
qccmbc
atpaca
caw1ba
byccb7
dedaa8
6ydbdc
这样,我们就可以简单的实现一个,直播视频app源码邀请码的功能了。
声明:本文由云豹科技转发自AndyQsmart博客,如有侵权请联系作者删除