php根据id生成10位不重复数字跟字母混合字符串最终生成效果

S9q6Cdw9wB
e5D9uS6Lw2
w9G3KIJkwa
Q0F8d6LSwb
M7q3OvSDwC
C8g4MLZ2wD
S8L8d4xGwc
s8f19VIowE
Q5L2SV3bwF
H9W42ctdwG

php代码

<?php
namespace  App\Services;
// 邀请码服务
class  InviteCodeService
{
 protected  $key,$num,$wordKey,$numericKey;
 public  function  __construct()
    {
 $this->key = 'X1A3B2abCDcEFGdH4eI5JfK6LgNM7OhP8QiR9SjTkUlVmWnSoYpZqrstuvwxyz';
 $this->wordKey = 'AaBbCDcdeEfFgGihHIjJlKknmLqoNrwMpsvsOuPytQRzSTUVWSYZ';
 $this->numericKey = '1234567890';
 // 注意这个key里面不能出现数字0  否则当 求模=0 会重复的
 // 多少进制
 $this->num = strlen($this->key);
    }
 // 传递用户id生成唯一邀请码
 public  function  enCode(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 (new  InviteCodeService)->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根据id生成10位不重复数字跟字母混合字符串的详细内容,更多关于php根据id生成10位不重复数字跟字母混合字符串的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
  • PHP利用雪花(SnowFlake)算法生成唯一ID
  • php生成唯一uid的解决方法详解
  • 高并发php uniqid不重复唯一标识符生成方案
  • 详解php中生成标准uuid(guid)的方法
  • PHP实现的生成唯一RequestID类完整示例
  • php根据数据id自动生成编号的实现方法
  • 3种php生成唯一id的方法
  • 使用PHP uniqid函数生成唯一ID
  • php中session_id()函数详细介绍,会话id生成过程及session id长度
  • php GUID生成函数和类
  • php 生成唯一id的几种解决方法

点赞(520) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部