java生成一条唯一的邀请码_如何实现用户id生成一个唯一邀请码

本文介绍了一种方法,通过将用户ID转换为36进制(剔除0并打乱顺序),生成唯一的邀请码。邀请码既能隐藏用户ID,又能保证反向推算用户ID的可行性,同时优化了长度。文章还提供了生成和解码邀请码的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据用户id生成与之对应的唯一邀请码,范围为‘0-9A-Z’。这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升。

错误思路

随机生成一个字符串,再将用户id拼接到字符串后面,但是这样id就太明显了,容易暴露,而且如果id很长的话,会导致邀请码很长,不利于用户使用。

所以可以将用户id插入到生成的字符串中,隔一个字符插入一个id的数字,这样id混合在字符串中,不容易暴露,但是长度问题并没有得到优化,于是把隔一个字符插入一个id的数字改为隔一个字符插入两个id的数字。然而长度好像并没有受到太大的影响。

正解

思考:一个10进制的数字短还是一个16进制的数字短?

肯定是16进制相对短一些,所以我们可以直接把用户id转成10+26=36进制的不就可以了吗?具体代码如下:

function createCode($user_id)

{static $source_string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

$num=$user_id;

$code= '';while($num)

{

$mod= $num % 36;

$num= ($num - $mod) / 36;

$code=$source_string[$mod].$code;

}return$code;

}

邀请码保证了唯一性,并且长度不会太长,用户id也能够根据邀请码反推出来,但是有一点不好的是,别人也可以根据邀请码去反推出user_id,因此,我们需要做一些优化。

优化

把0剔除,当做补位符号,比如小于四位的邀请码在高位补0,这样36进制就变成了35进制,然后把字符串顺序打乱,这样,在不知道$source_string的情况下,是没办法解出正确的user_id的。

代码如下:

function createCode($user_id) {static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';$num = $user_id;$code = '';while ( $num > 0) {$mod = $num % 35;$num = ($num - $mod) / 35;$code = $source_string[$mod].$code;

}if(empty($code[3]))$code = str_pad($code,4,'0',STR_PAD_LEFT);return $code;

}

这样,对应user_id的唯一邀请码就生成了,再附一个解码函数:

function decode($code) {static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';if (strrpos($code, '0') !== false)$code = substr($code, strrpos($code, '0')+1);$len = strlen($code);$code = strrev($code);$num = 0;for ($i=0; $i < $len; $i++) {$num += strpos($source_string, $code[$i]) * pow(35, $i);

}return $num;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值