web-dev-qa-db-fra.com

Comment puis-je créer une chaîne aléatoire unique dans laravel 5

Je suis nouveau à laravel 5. Je travaille sur un projet où je veux attribuer des uniques lisibles au hasard uniques chaîne à chaque application. Je connais l'id de chaque application qui peut être utilisé comme graine. Puisque l'application va être utilisée au sein de l'entreprise, je ne me soucie pas beaucoup de la sécurité. Je m'attends à ce que la taille de la table augmente, donc mon le but est d'obtenir l'unicité autant que possible car le champ dans DB est unique. Un code comme (EN1A20, EN12ZOV etc.). Si la fonction peut me permettre de passer la longueur de la chaîne que je veux renvoyer, ce serait vraiment génial .

Modifier Ci-dessous est ma tentative de résoudre le problème

private function generate_app_code($application_id) { 
        $token = $this->getToken(6, $application_id);
        $code = 'EN'. $token . substr(strftime("%Y", time()),2);

        return $code;
    }

    private function getToken($length, $seed){    
        $token = "";
        $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        $codeAlphabet.= "0123456789";

        mt_srand($seed);      // Call once. Good since $application_id is unique.

        for($i=0;$i<$length;$i++){
            $token .= $codeAlphabet[mt_Rand(0,strlen($codeAlphabet)-1)];
        }
        return $token;
    }

Le code ci-dessus peut-il faire l'affaire?

Modifier

En fait, j'ai emprunté des idées à ce post PHP: Comment générer une chaîne alphanumérique aléatoire, unique? pour sortir avec les méthodes ci-dessus mais le post ne résout pas entièrement mes problèmes. Mon objectif est de générer une chaîne de longueur disons 6 à 8 (alphanumérique et lisible). Cette chaîne serait utilisée par mon administrateur à des fins de requête. Dans ma fonction, j'ai mt_srand ($ seed) pour amorcer le générateur de nombres aléatoires où seed est mon application_id. Il est possible d'obtenir un jeton $ en double.

Appréciez l'aide.

10
Fokwa Best

Avec votre tentative pour résoudre le problème, vous pouvez appliquer les éléments suivants pour garantir un code unique:

do
{
    $token = $this->getToken(6, $application_id);
    $code = 'EN'. $token . substr(strftime("%Y", time()),2);
    $user_code = User::where('user_code', $code)->get();
}
while(!empty($user_code));

Modifier

Pour éviter une boucle infinie dans laravel, utilisez

do
    {
        $token = $this->getToken(6, $application_id);
        $code = 'EN'. $token . substr(strftime("%Y", time()),2);
        $user_code = User::where('user_code', $code)->get();
    }
    while(!$user_code->isEmpty());

http://laravel.com/api/5.0/Illuminate/Support/Collection.html#method_isEmpty

ou allez avec

  do
        {
            $token = $this->getToken(6, $application_id);
            $code = 'EN'. $token . substr(strftime("%Y", time()),2);
            $user_code = User::where('user_code', $code)->first();
        }
        while(!empty($user_code));

Au lieu de get (), utilisez first (). $ user_code est probablement unique, nous pouvons donc facilement extraire le premier résultat.

7
user2094178

Vous pouvez utiliser :

sha1(time())

Explication: sha1 est une fonction de hachage, et la caractéristique la plus importante de la fonction de hachage est qu'ils ne produisent jamais le même hachage de chaîne différente, de sorte que time () est toujours unique en théorie sha1 (time ()) vous donnera toujours une chaîne unique avec fixe largeur.

ÉDITÉ:

Vous pouvez utiliser votre fonction, mais avant de donner un jeton, vous pouvez vous connecter à la base de données et vérifier si le jeton existe, s'il existe générer un nouveau jeton, s'il n'existe pas, donnez-lui ce jeton. Ce mécanisme vous donnera des jetons uniques.

9
fico7489

Vous pouvez utiliser la fonction d'aide intégrée:

str_random(int);

La documentation peut être trouvée: Laravel 5.1 Docs

Pour vous assurer qu'il est unique, vous pouvez toujours vérifier que le nom n'existe pas déjà et s'il réexécute la fonction pour générer une nouvelle chaîne.

J'espère que cela pourra aider.

6
Flyingearl