欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php根據(jù)id生成10位不重復(fù)數(shù)字跟字母混合字符串

 更新時(shí)間:2023年05月27日 16:13:36   投稿:wdc  
這篇文章主要介紹了php根據(jù)id生成10位不重復(fù)數(shù)字跟字母混合字符串方法,需要的朋友可以參考下

php根據(jù)id生成10位不重復(fù)數(shù)字跟字母混合字符串最終生成效果

S9q6Cdw9wB
e5D9uS6Lw2
w9G3KIJkwa
Q0F8d6LSwb
M7q3OvSDwC
C8g4MLZ2wD
S8L8d4xGwc
s8f19VIowE
Q5L2SV3bwF
H9W42ctdwG

php代碼

<?php
namespace  App\Services;
// 邀請碼服務(wù)
class  InviteCodeService
{
 protected  $key,$num,$wordKey,$numericKey;
 public  function  __construct()
    {
 $this->key = 'X1A3B2abCDcEFGdH4eI5JfK6LgNM7OhP8QiR9SjTkUlVmWnSoYpZqrstuvwxyz';
 $this->wordKey = 'AaBbCDcdeEfFgGihHIjJlKknmLqoNrwMpsvsOuPytQRzSTUVWSYZ';
 $this->numericKey = '1234567890';
 // 注意這個(gè)key里面不能出現(xiàn)數(shù)字0  否則當(dāng) 求模=0 會重復(fù)的
 // 多少進(jìn)制
 $this->num = strlen($this->key);
    }
 // 傳遞用戶id生成唯一邀請碼
 public  function  enCode(int  $user_id, $length = 10)
    {
 $code = $end = $begin = $middle = ''; // 邀請碼
 //末尾用取模算法保證唯一
 while ($user_id > 0) { // 轉(zhuǎn)進(jìn)制
 $mod = $user_id % $this->num; // 求模
 $user_id = ($user_id - $mod) / $this->num;
 $end = $this->key[$mod] .  $end;
        }
 // 開頭使用4位隨機(jī)的數(shù)字加字母
 $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)];
 // 中間用隨機(jī)字符串補(bǔ)充
 while((strlen($begin)+strlen($middle)+strlen($end)) < $length){
 $middle = $this->key[rand(0, $this->num - 1)] .  $middle;
        }
 $code = $begin.$middle.$end;
 return  $code;
    }
     /**
     * 邀請碼獲取用戶id  一般都不需要用到
     * 這里的解密代碼不完整,思路是對的
     * 解密思路
     * 加密的時(shí)候最后一位記錄唯一串的長度,也就是 $end 的長度
     * 解密的時(shí)候讀取串的最后一位獲得長度,根據(jù)長度獲取 $end 字符串
     * $end 通過以下函數(shù)就能實(shí)現(xiàn)解密
     * */ 
    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 數(shù)據(jù)是沒有重復(fù)的,并且邀請碼解 用戶id 也是正確的。

要注意的

$this->key 不能出現(xiàn)數(shù)字 0

$this->key 不能有重復(fù)的字符串。 如: abccd c重復(fù)。

關(guān)于$this->key

$this->key 順序可以打亂的,

// $this->key = 'abcdefghjkmnpqrstuvwxyz123456789'; // 沒打亂的
$this->key = 'kh8sjpdazetnmb5yw7rq4gc9fuv3216x'; // 打亂的

$this->key 長度不限制, 但是最好別太短。
如 abcd: 最大的 用戶id 是4的3次方 (256)
超過256會怎么樣? 邀請碼變成5位而已 ……. ,不好看。

為用戶體驗(yàn),$this->key 字符串別加 i o l 這些字母,因?yàn)槿菀谆煜脩簟?br />i : ll : 1o : 0 (當(dāng)然0 是不能出現(xiàn)的)
很相似。

結(jié)尾

中間四位字符串確保有字符串+數(shù)字,

尾數(shù)6位數(shù)確保隨機(jī)性,6位數(shù)足夠61^6次方,也就是 51520374361,這個(gè)數(shù)字比 int(11)表示的最大值 2147483648 還要大 49372890713。5位數(shù)就足夠覆蓋 int(11),剩余一位由開頭補(bǔ)充

開頭補(bǔ)充數(shù)字確保夠10位

以上就是php根據(jù)id生成10位不重復(fù)數(shù)字跟字母混合字符串的詳細(xì)內(nèi)容,更多關(guān)于php根據(jù)id生成10位不重復(fù)數(shù)字跟字母混合字符串的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論