Créer un nouveau fichier app/Services/InviteCodeService.php<?php namespace App\Services;// 邀请码服务class InviteCodeService{
protected $key,$num;
public function __construct()
{
$this->key = 'abcdefghjkmnpqrstuvwxyz123456789';
// 注意这个key里面不能出现数字0 否则当 求模=0 会重复的
// 多少进制
$this->num = strlen($this->key);
}
// 传递用户id生成唯一邀请码
public function enCode(int $user_id)
{
$code = ''; // 邀请码
while ($user_id > 0) { // 转进制
$mod = $user_id % $this->num; // 求模
$user_id = ($user_id - $mod) / $this->num;
$code = $this->key[$mod] . $code;
}
$code = str_pad($code, 4, '0', STR_PAD_LEFT); // 不足用0补充
return $code;
}
// 邀请码获取用户id 一般都不需要用到
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 key, $code[$i]) * pow($this->num, $i);
return $user_id;
}}
Lier au conteneurCela dépend de votre préférence, si vous ne souhaitez pas lier C'est tout
.
use App\Services\InviteCodeService;
public function register()
{
$this->app->singleton('invite_code',InviteCodeService::class);
}
new AppServicesInviteCodeService
Test d'unicité
$max_num = 200000;
$codes = [];
for ($i = 1; $i enCode($i);
$i = 1;
foreach ($codes as $code){
$userId = app('invite_code')->deCode($code); // 邀请码获取用户id
if( $userId != $i)
dd("邀请码解密错误".$i);
$i++;
}
$unique_count = count(array_unique($codes));
dd($unique_count); // 不重复的总数
app/Providers/AppServiceProvider.php
Les données ne sont pas dupliquées , et la solution du code d'invitation
est également correcte.
Il est à noter que les 20w
用户id
numéros
Il ne peut pas y avoir de chaînes en double. Par exemple : -
$this->key
Répétez. 0
-
$this->key
abccd
À propos de $this->keyc
// $this->key = 'abcdefghjkmnpqrstuvwxyz123456789'; // 没打乱的$this->key = 'kh8sjpdazetnmb5yw7rq4gc9fuv3216x'; // 打乱的
-
Il n'y a pas de limite de longueur, mais il vaut mieux ne pas être trop court. $this->key
Par exemple,
: Le plus grand est 4 élevé à la puissance trois (256). Que se passera-t-il si - dépasse 256 Le code d'invitation ne comporte plus que 5 chiffres..., ce qui n'est pas le cas. Ça n'a pas l'air bien.
$this->key
abcd
Pour l'expérience utilisateur, n'ajoutez pas 用户id
à la chaîne car il est facile de confondre les utilisateurs. : $this->key
i
o
: l
i
: l
(Bien sûr,
ne peut pas apparaître) l
est très similaire. 1
o
0
0
Ps
Le nombre de chiffres du code d'invitation générés dépend du nombre de fois
pouvant être modulé.
Exemple用户id
Supposons
C'est la base 4.
Par exemple : $this->key = abcd
Code d'invitation à 4 chiffres.
Code d'invitation à 5 chiffres.
用户id
Code d'invitation à 5 chiffres.
......255
(Donc s'il y a une limite sur le nombre de codes d'invitation, vous saurez quoi faire si vous êtes malin)256
500
Hex Quel est l'ID utilisateur maximum d'un code d'invitation à 4 chiffres ?
32
Conneries
32^4 = 1048576
Parce que je souhaitez utiliser la fonction code d'invitation, ma première réaction :
Bien que le code trouvé sur Baidu soit utilisable, il était répétitif et insatisfaisant, j'ai donc adapté le code des autres.
Ensuite, il y a cet article.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!