最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
php根据id生成10位不重复数字跟字母混合字符串
时间:2026-09-22 21:40:01 编辑:袖梨 来源:一聚教程网
php根据id生成10位不重复数字跟字母混合字符串最终生成效果
S9q6Cdw9wBe5D9uS6Lw2w9G3KIJkwaQ0F8d6LSwbM7q3OvSDwCC8g4MLZ2wDS8L8d4xGwcs8f19VIowEQ5L2SV3bwFH9W42ctdwG
php代码
<?phpnamespaceAppServices;// 邀请码服务classInviteCodeService{ protected$key,$num,$wordKey,$numericKey; publicfunction__construct(){ $this->key = 'X1A3B2abCDcEFGdH4eI5JfK6LgNM7OhP8QiR9SjTkUlVmWnSoYpZqrstuvwxyz'; $this->wordKey = 'AaBbCDcdeEfFgGihHIjJlKknmLqoNrwMpsvsOuPytQRzSTUVWSYZ'; $this->numericKey = '1234567890'; // 注意这个key里面不能出现数字0否则当 求模=0 会重复的 // 多少进制 $this->num = strlen($this->key);} // 传递用户id生成唯一邀请码 publicfunctionenCode(int$user_id, $length = 10){ $code = $end = $begin = $middle = ''; // 邀请码 //末尾用取模算法保证唯一 while ($user_id > 0) { // 转进制 $mod = $user_id % $this->num; // 求模 $user_id = ($user_id - $mod) / $this->num; $end = $this->key[$mod] .$end;} // 开头使用4位随机的数字加字母 $begin = $this->wordKey[rand(0, strlen($this->wordKey) - 1)] .$this->numericKey[rand(0, strlen($this->numericKey) - 1)] .$this->wordKey[rand(0, strlen($this->wordKey) - 1)] .$this->numericKey[rand(0, strlen($this->numericKey) - 1)]; // 中间用随机字符串补充 while((strlen($begin)+strlen($middle)+strlen($end)) < $length){ $middle = $this->key[rand(0, $this->num - 1)] .$middle;} $code = $begin.$middle.$end; return$code;} /** * 邀请码获取用户id一般都不需要用到 * 这里的解密代码不完整,思路是对的 * 解密思路 * 加密的时候最后一位记录唯一串的长度,也就是 $end 的长度 * 解密的时候读取串的最后一位获得长度,根据长度获取 $end 字符串 * $end 通过以下函数就能实现解密 * */ function deCode($code){if (strrpos($code, '0') !== false)$code = substr($code, strrpos($code, '0') + 1);$len = strlen($code);$code = strrev($code);$user_id = 0;for ($i = 0; $i < $len; $i++)$user_id += strpos($this->key, $code[$i]) * pow($this->num, $i);return $user_id;}$a = 3600;$b = $a + 10;for($i=$a ; $i<$b;$i++){ echo (newInviteCodeService)->enCode($i); echo PHP_EOL;}20w数据是没有重复的,并且邀请码解用户id也是正确的。
要注意的
$this->key不能出现数字0。
$this->key不能有重复的字符串。 如:abccdc重复。
关于$this->key
$this->key顺序可以打乱的,
// $this->key = 'abcdefghjkmnpqrstuvwxyz123456789'; // 没打乱的$this->key = 'kh8sjpdazetnmb5yw7rq4gc9fuv3216x'; // 打乱的
$this->key长度不限制, 但是最好别太短。如abcd: 最大的用户id是4的3次方 (256)超过256会怎么样? 邀请码变成5位而已 ....... ,不好看。
为用户体验,$this->key字符串别加iol这些字母,因为容易混淆用户。i:ll:1o:0(当然0是不能出现的)很相似。
结尾
中间四位字符串确保有字符串+数字,
尾数6位数确保随机性,6位数足够61^6次方,也就是 51520374361,这个数字比 int(11)表示的最大值 2147483648 还要大 49372890713。5位数就足够覆盖 int(11),剩余一位由开头补充
开头补充数字确保够10位
相关文章
- PHP高并发高负载下的3种实战场景解决方法示例 09-22
- php解决注册并发问题并提高QPS 09-22
- ThinkPHP5.0之底层运行原理执行流程分析 09-22
- php中关于token验证的相关问题详解 09-22
- phpstorm断点调试方法图文详解 09-22
- 使用Canal实现PHP应用程序与MySQL数据库的实时数据同步 09-22