现在的web应用中都经常会遇到邀请码或激活码等问题,如何生成唯一且随机的激活码是一个问题。下面的这个方法的唯一性怎么得到的。
条件是邀请码都是数字的
1) 获取id: 155
2) 转换成8进制:233
3) 转为字符串,并在后面加'9'字符:2339
4)在后面随机产生若干个随机数字字符:2003967524987
转为8进制后就不会出现9这个字符,然后在后面加个'9',这样就能确定唯一性。最后在后面产生一些随机数字就可以。
现在的web应用中都经常会遇到邀请码或激活码等问题,如何生成唯一且随机的激活码是一个问题。下面的这个方法的唯一性怎么得到的。
条件是邀请码都是数字的
1) 获取id: 155
2) 转换成8进制:233
3) 转为字符串,并在后面加'9'字符:2339
4)在后面随机产生若干个随机数字字符:2003967524987
转为8进制后就不会出现9这个字符,然后在后面加个'9',这样就能确定唯一性。最后在后面产生一些随机数字就可以。
1 回答3k 阅读✓ 已解决
1 回答2.7k 阅读
2.5k 阅读
1 回答931 阅读✓ 已解决
1 回答1.1k 阅读
1 回答354 阅读✓ 已解决
813 阅读
ID是唯一的,不然就不是ID了。那么ID不管转成几进制,它都是唯一的,为什么要加9呢?
注意这里还有一个后续的操作,就是后缀一个随机数,那么,假设我们用10进制,就可能会出现这样的情况
ID=15,R=56789,拼出来是156789
ID=155,R=6789,拼出来是156789
出现重复
解决办法是在ID和随机数R之间加一个分隔符,避免它们的混淆。
如果没要求随机码是数字,那这个分隔符好办,但看楼主的意思,这个随机码得是数字组成的,所以需要用一个不可能出现在ID中的数字来作为分隔符,所以……聪明人想到了8进制,因为8进制里没有8和9,可以用8或者9来作为分隔符。
当然,2-8进制都是可以的,但是2进制生成的验证码太长,3-7进制不常用,也没有现成的算法,所以就选了8进制了。如果要求随机码尽可能的短,那么用9进制平均会短一点……这都是题外话了。
现在,ID唯一,ID转换为8进制唯一,加上固定的分隔符8或者9(任选其一,但选定了就得一直使用,不能换了),再加上任意后缀,它都唯一。
仍然需要注意,为同一个ID生成的两个随机码有可能出现重复,不过随机码一般都是使用一次就丢弃,所以一般不会出现为一个ID生成两个随机码的情况,所以可以不考虑了。