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;
// 邀請(qǐng)碼服務(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 會(huì)重復(fù)的
// 多少進(jìn)制
$this->num = strlen($this->key);
}
// 傳遞用戶id生成唯一邀請(qǐng)碼
public function enCode(int $user_id, $length = 10)
{
$code = $end = $begin = $middle = ''; // 邀請(qǐng)碼
//末尾用取模算法保證唯一
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;
}
// 開(kāi)頭使用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;
}
/**
* 邀請(qǐng)碼獲取用戶id 一般都不需要用到
* 這里的解密代碼不完整,思路是對(duì)的
* 解密思路
* 加密的時(shí)候最后一位記錄唯一串的長(zhǎng)度,也就是 $end 的長(zhǎng)度
* 解密的時(shí)候讀取串的最后一位獲得長(zhǎng)度,根據(jù)長(zhǎng)度獲取 $end 字符串
* $end 通過(guò)以下函數(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ù)是沒(méi)有重復(fù)的,并且邀請(qǐng)碼解 用戶id 也是正確的。
要注意的
$this->key 不能出現(xiàn)數(shù)字 0。
$this->key 不能有重復(fù)的字符串。 如: abccd c重復(fù)。
關(guān)于$this->key
$this->key 順序可以打亂的,
// $this->key = 'abcdefghjkmnpqrstuvwxyz123456789'; // 沒(méi)打亂的 $this->key = 'kh8sjpdazetnmb5yw7rq4gc9fuv3216x'; // 打亂的
$this->key 長(zhǎng)度不限制, 但是最好別太短。
如 abcd: 最大的 用戶id 是4的3次方 (256)
超過(guò)256會(huì)怎么樣? 邀請(qǐng)碼變成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),剩余一位由開(kāi)頭補(bǔ)充
開(kāi)頭補(bǔ)充數(shù)字確保夠10位
以上就是php根據(jù)id生成10位不重復(fù)數(shù)字跟字母混合字符串的詳細(xì)內(nèi)容,更多關(guān)于php根據(jù)id生成10位不重復(fù)數(shù)字跟字母混合字符串的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- PHP利用雪花(SnowFlake)算法生成唯一ID
- php生成唯一uid的解決方法詳解
- 高并發(fā)php uniqid不重復(fù)唯一標(biāo)識(shí)符生成方案
- 詳解php中生成標(biāo)準(zhǔn)uuid(guid)的方法
- PHP實(shí)現(xiàn)的生成唯一RequestID類完整示例
- php根據(jù)數(shù)據(jù)id自動(dòng)生成編號(hào)的實(shí)現(xiàn)方法
- 3種php生成唯一id的方法
- 使用PHP uniqid函數(shù)生成唯一ID
- php中session_id()函數(shù)詳細(xì)介紹,會(huì)話id生成過(guò)程及session id長(zhǎng)度
- php GUID生成函數(shù)和類
- php 生成唯一id的幾種解決方法
相關(guān)文章
thinkphp實(shí)現(xiàn)把數(shù)據(jù)庫(kù)中的列的值存到下拉框中的方法
本文主要介紹了thinkphp把數(shù)據(jù)庫(kù)中的列的值存到下拉框中的方法。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01
php與flash as3 socket通信傳送文件實(shí)現(xiàn)代碼
這篇文章主要介紹了php與flash as3 socket通信傳送文件實(shí)現(xiàn)代碼,本文含AS3代碼和PHP代碼,需要的朋友可以參考下2014-08-08
PHP下ajax跨域的解決方案之window.name實(shí)例分析
這篇文章主要介紹了PHP下ajax跨域的解決方案之window.name,結(jié)合實(shí)例形式分析PHP ajax跨域的解決方案window.name基本原理、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-03-03
php中session_unset與session_destroy的區(qū)別分析
關(guān)于session_unset()和session_destroy()的函數(shù)使用進(jìn)行介紹。學(xué)習(xí)php的朋友可以參考下。2011-06-06
修改了一個(gè)很不錯(cuò)的php驗(yàn)證碼(支持中文)
很早前在PHP喜悅國(guó)際村看到的一個(gè)驗(yàn)證碼類,寫的很強(qiáng)。但有些邏輯方面感覺(jué)處理的不好,然后我不喜歡完全用session來(lái)處理驗(yàn)證碼。這在大型系統(tǒng)中是很不好的2007-02-02
php strnatcmp()函數(shù)的用法總結(jié)
這篇文章主要是對(duì)php中strnatcmp()函數(shù)的用法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11
php實(shí)時(shí)倒計(jì)時(shí)功能實(shí)現(xiàn)方法詳解
這篇文章主要介紹了php實(shí)時(shí)倒計(jì)時(shí)功能實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了php結(jié)合前臺(tái)JS的時(shí)間戳操作實(shí)現(xiàn)倒計(jì)時(shí)功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
php 的加密函數(shù) md5,crypt,base64_encode 等使用介紹
php 在做注冊(cè)、登錄或是url 傳遞參數(shù)時(shí)都會(huì)用到 字符變量的加密,下面我們就來(lái)簡(jiǎn)單的介紹下:php 自帶的加密函數(shù)2012-04-04

