Maison >cadre php >Laravel >Comment Laravel génère-t-il un code d'invitation unique à quatre chiffres basé sur l'ID utilisateur ?

Comment Laravel génère-t-il un code d'invitation unique à quatre chiffres basé sur l'ID utilisateur ?

藏色散人
藏色散人avant
2020-11-01 16:22:313835parcourir

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

.

Edit

    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 ne peuvent pas apparaître.

    Il ne peut pas y avoir de chaînes en double. Par exemple :
  1. $this->key Répétez. 0
  2. $this->keyabccdÀ propos de $this->keyc

La commande peut être perturbée,
// $this->key = 'abcdefghjkmnpqrstuvwxyz123456789'; // 没打乱的$this->key = 'kh8sjpdazetnmb5yw7rq4gc9fuv3216x'; // 打乱的

  1. Il n'y a pas de limite de longueur, mais il vaut mieux ne pas être trop court. $this->keyPar exemple,

     : Le plus grand
  2. est 4 élevé à la puissance trois (256). Que se passera-t-il si
  3. 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
  4. car il est facile de confondre les utilisateurs.
  5. : $this->keyio : l
    i : l (Bien sûr,
    ne peut pas apparaître) l est très similaire. 1
    o00
    Ps

Le nombre de chiffres du code d'invitation générés dépend du nombre de fois

pouvant être modulé.

Exemple用户idSupposons

C'est la base 4.

Par exemple : $this->key = abcd

Code d'invitation à 4 chiffres. Comment Laravel génère-t-il un code dinvitation unique à quatre chiffres basé sur lID utilisateur ?

Code d'invitation à 5 chiffres.

用户idCode 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 = 1048576Parce 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer