Créer un nouveau fichier app/Services/InviteCodeService.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <a href= "https://www.php.cn/phpkj/laravel/" target= "_blank" ><?php namespace App\Services;// 邀请码服务 class InviteCodeService{
protected $key , $num ;
public function __construct()
{
$this ->key = 'abcdefghjkmnpqrstuvwxyz123456789' ;
$this ->num = strlen ( $this ->key);
}
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);
return $code ;
}
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 ;
}}</a>
|
Lier au conteneurCela dépend de votre préférence, si vous ne souhaitez pas lier C'est tout
.
1 2 3 4 5 | use App\Services\InviteCodeService;
public function register()
{
$this ->app->singleton( 'invite_code' ,InviteCodeService:: class );
}
|
Copier après la connexion
new AppServicesInviteCodeService
Test d'unicité
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $max_num = 200000;
$codes = [];
for ( $i = 1; $i enCode( $i );
$i = 1;
foreach ( $codes as $code ){
$userId = app( 'invite_code' )->deCode( $code );
if ( $userId != $i )
dd( "邀请码解密错误" . $i );
$i ++;
}
$unique_count = count ( array_unique ( $codes ));
dd( $unique_count );
|
Copier après la connexion
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
Copier après la connexion
-
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!