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'; // 注意這個key里面不能出現(xiàn)數(shù)字0 否則當(dāng) 求模=0 會重復(fù)的 // 多少進制 $this->num = strlen($this->key); } // 傳遞用戶id生成唯一邀請碼 public function enCode(int $user_id, $length = 10) { $code = $end = $begin = $middle = ''; // 邀請碼 //末尾用取模算法保證唯一 while ($user_id > 0) { // 轉(zhuǎn)進制 $mod = $user_id % $this->num; // 求模 $user_id = ($user_id - $mod) / $this->num; $end = $this->key[$mod] . $end; } // 開頭使用4位隨機的數(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)]; // 中間用隨機字符串補充 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 的長度 * 解密的時候讀取串的最后一位獲得長度,根據(jù)長度獲取 $end 字符串 * $end 通過以下函數(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位而已 ……. ,不好看。
為用戶體驗,$this->key
字符串別加 i
o
l
這些字母,因為容易混淆用戶。i
: l
l
: 1
o
: 0
(當(dāng)然0
是不能出現(xiàn)的)
很相似。
結(jié)尾
中間四位字符串確保有字符串+數(shù)字,
尾數(shù)6位數(shù)確保隨機性,6位數(shù)足夠61^6次方,也就是 51520374361,這個數(shù)字比 int(11)表示的最大值 2147483648 還要大 49372890713。5位數(shù)就足夠覆蓋 int(11),剩余一位由開頭補充
開頭補充數(shù)字確保夠10位
以上就是php根據(jù)id生成10位不重復(fù)數(shù)字跟字母混合字符串的詳細內(nèi)容,更多關(guān)于php根據(jù)id生成10位不重復(fù)數(shù)字跟字母混合字符串的資料請關(guān)注腳本之家其它相關(guān)文章!
- PHP利用雪花(SnowFlake)算法生成唯一ID
- php生成唯一uid的解決方法詳解
- 高并發(fā)php uniqid不重復(fù)唯一標(biāo)識符生成方案
- 詳解php中生成標(biāo)準(zhǔn)uuid(guid)的方法
- PHP實現(xiàn)的生成唯一RequestID類完整示例
- php根據(jù)數(shù)據(jù)id自動生成編號的實現(xiàn)方法
- 3種php生成唯一id的方法
- 使用PHP uniqid函數(shù)生成唯一ID
- php中session_id()函數(shù)詳細介紹,會話id生成過程及session id長度
- php GUID生成函數(shù)和類
- php 生成唯一id的幾種解決方法
相關(guān)文章
PHP中執(zhí)行MYSQL事務(wù)解決數(shù)據(jù)寫入不完整等情況
事務(wù)可以進行模擬SQL操作,當(dāng)所有的SQL都操作成功的時候才進行SQL操作,只要有一個操作失敗就回滾當(dāng)前事務(wù)的所有SQL操作,避免出現(xiàn)上面描述中出現(xiàn)的數(shù)據(jù)寫入不完整等情況2014-01-01PHP常量使用的幾個需要注意的地方(謹慎使用PHP中的常量)
常量包含數(shù)字字母字符和下劃線,數(shù)字允許作為常量名。 常量名的所有字母必須大寫。類常量必須通過 const 定義為類的成員,強烈不鼓勵使用 define 定義的全局常量2014-09-09解析zend studio中直接導(dǎo)入svn中的項目的方法步驟
本篇文章是對zend studio中直接導(dǎo)入svn中的項目的方法步驟進行了詳細的分析介紹,需要的朋友參考下2013-06-06PHP中addslashes()和stripslashes()實現(xiàn)字符串轉(zhuǎn)義和還原用法實例
這篇文章主要介紹了PHP中addslashes()和stripslashes()實現(xiàn)字符串轉(zhuǎn)義和還原用法,結(jié)合實例形式較為詳細的分析了addslashes()和stripslashes()函數(shù)的功能,定義及具體使用技巧,并附帶說明了addslashes()與addcslashes()函數(shù)的區(qū)別,需要的朋友可以參考下2016-01-01PHP獲取ip對應(yīng)地區(qū)和使用網(wǎng)絡(luò)類型的方法
這篇文章主要介紹了PHP獲取ip對應(yīng)地區(qū)和使用網(wǎng)絡(luò)類型的方法,實例分析了php通過調(diào)用ip138數(shù)據(jù)庫獲取IP及網(wǎng)絡(luò)類型的技巧,需要的朋友可以參考下2015-03-03php+Memcached實現(xiàn)簡單留言板功能示例
這篇文章主要介紹了php+Memcached實現(xiàn)簡單留言板功能,結(jié)合實例形式較為詳細的分析了php結(jié)合memcached實現(xiàn)留言板的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-02-02