8791 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous,

Savez-vous quelle est la meilleure méthode pour générer une chaîne unique ? Je connais bien la fonction uniqid(), mais celle-ci est très moyenne car deux générations successives se ressemblent, vu qu'elle est basée sur microtime.

Il y a aussi cette fonction qui est très connue sur le web mais son unicité est-elle garantie selon-vous ?

<?php
function random($car) {
$string = "";
$chaine = "abcdefghijklmnpqrstuvwxy";
srand((double)microtime()*1000000);
for($i=0; $i<$car; $i++) {
$string .= $chaine[rand()%strlen($chaine)];
}
return $string;
}

// APPEL
// Génère une chaine de longueur 20
$chaine = random(20);

?>


Bref quelle solution utilisez-vous pour générer vos chaînes uniques ?

Merci d'avance Smiley smile
Merci de ta réponse Smiley smile

Je cherche plus des chaînes de 12/14 caractères, et les résultats de uniqid sont trop successifs, md5 et sha1 beaucoup trop long =S
Si md5 est trop long tu peux utiliser crc32 ou adler32 mais tu auras un léger risque de collision. C'est pour quoi faire exactement ?


hash('crc32b', $data);

hash('adler32', $data);

Modifié par jb_gfx (25 Sep 2012 - 20:57)
Bonjour,
La plus infaillible et UNIQUE des chaine, reste bien sur l'ID de session.
Je m'en sert parfois, en effet lorsqu'un visiteur arrive je fais un session_start puis je concerve son session ID ...

C' est juste une piste Smiley cligne

Christele
Christele a écrit :
Bonjour,
La plus infaillible et UNIQUE des chaine, reste bien sur l'ID de session.
Je m'en sert parfois, en effet lorsqu'un visiteur arrive je fais un session_start puis je concerve son session ID ...

C' est juste une piste Smiley cligne

Christele


C'est également le choix que je fais lorsque j'en ai besoin Smiley cligne
Modifié par Apoooo (26 Sep 2012 - 09:18)
L'id de session c'est juste un sha1 de l'adresse IP de l'utilisateur, de la date et heure de connexion et d'un nombre aléatoire.

La valeur la plus unique pour les utilisateurs, à priori c'est l'adresse email ou le login, ou encore la primary key de la table user. Ou un mix des trois. Smiley smile
Modifié par jb_gfx (26 Sep 2012 - 16:33)
jb_gfx a écrit :
L'id de session c'est juste un sha1 de l'adresse IP de l'utilisateur, de la date et heure de connexion et d'un nombre aléatoire.


Oui donc un ID où le risque de collision est très proche de 0 quoi Smiley lol
Apoooo a écrit :


Oui donc un ID où le risque de collision est très proche de 0 quoi Smiley lol


Si tu (et Cristele) avais lu le sujet avant de répondre tu aurais vu qu'un hash sha1 ne convient pas car trop long.

En plus le risque de collision existe aussi puisque php vérifie l'unicité de l'id uniquement à un instant t.
Modifié par jb_gfx (26 Sep 2012 - 16:46)
jb_gfx a écrit :


Si tu (et Cristele) avais lu le sujet avant de répondre tu aurais vu qu'un hash sha1 ne convient pas car trop long.


J'ai lu le sujet, c'est juste comme l'a dis Cristele :
Cristele a écrit :

C' est juste une piste Smiley cligne


Rien n'empeche de récupérer l'ID de Session et la retravailler pour insérer, retirer, mélanger des nouveaux caractères... Tout en gardant la taille voulue de 12 caractères.
Surtout que tu te doutes bien que plus tu réduits le nombres de caractères, plus le risque de collision augmente.

Je ne sais pas sur quel projet cet ID sera utilisé mais pour considérer qu'un ID n'est pas fiable alors qu'il a encore moins de chance d'être en doublon que la probabilité de gagner au LOTO, bha...
Modifié par Apoooo (27 Sep 2012 - 10:14)
Apoooo a écrit :

Rien n'empeche de récupérer l'ID de Session et la retravailler pour insérer, retirer, mélanger des nouveaux caractères... Tout en gardant la taille voulue de 12 caractères.
Surtout que tu te doutes bien que plus tu réduits le nombres de caractères, plus le risque de collision augmente.


Non mais n'importe quoi, vraiment.
jb_gfx a écrit :
L'id de session c'est juste un sha1 de l'adresse IP de l'utilisateur, de la date et heure de connexion et d'un nombre aléatoire.


Tu as lu celadans ta boule de christale Smiley confused
Tu écris ici pour te faire valoir, mais en fait ici il vaut mieux écrire pour aider et UNIQUEMENT lorsque ce que l'on avance est fiable.

Rédactrice correctrice dans PHP.NET je te conseille d'y lire comment fabriquer son ID de session, et l'imposer juste avant le session start !

Au moins tu auras appris quelque chose aujourd'hui, et sera un peut moins pédant.

Christele
Christele a écrit :
La plus infaillible et UNIQUE des chaine, reste bien sur l'ID de session.

Non justement, sinon personne ne chercherait à améliorer la façon dont sont générés ces IDs par PHP. Les collisions de sessions ça existe, et pas forcément sur des sites à plusieurs millions de vues par jour.

Christele a écrit :
Rédactrice correctrice dans PHP.NET je te conseille d'y lire comment fabriquer son ID de session, et l'imposer juste avant le session start !

Tu ne corriges par l'orthographe au moins??? Smiley eek
Yvan L. a écrit :
Non justement, sinon personne ne chercherait à améliorer la façon dont sont générés ces IDs par PHP. Les collisions de sessions ça existe, et pas forcément sur des sites à plusieurs millions de vues par jour.


+1, celas dit, plus le nombre de caractères possible est grand et la chaine longue, plus le risque de collision est faible, l'annuler est impossible, il faut juste le descendre à un niveau acceptable.

Yvan L. a écrit :
Tu ne corriges par l'orthographe au moins??? Smiley eek


re +1

Christele a écrit :
Rédactrice correctrice dans PHP.NET je te conseille d'y lire comment fabriquer son ID de session, et l'imposer juste avant le session start !


Rassure moi, on doit pas prendre ça comme un gage de compétence? si?..

Christele a écrit :
Au moins tu auras appris quelque chose aujourd'hui, et sera un peut moins pédant.


Je saisi pas ce qu'il y avais à apprendre?
Modifié par JJK801 (12 Oct 2012 - 15:40)
Christele a écrit :


Tu as lu celadans ta boule de christale Smiley confused


Non, je l'ai lu (comme à chaque fois que j'ai un doute sur le fonctionnement de PHP) dans le code source de PHP, dans le dossier ext\session, fichier session.c, fonction php_session_create_id().

http://php.net/downloads.php#v5

Tu devrais t'y plonger (si tu sais lire le c) ça t’éviterai de raconter n'importe quoi (comme à ton habitude).

Christele a écrit :

Rédactrice correctrice dans PHP.NET je te conseille d'y lire comment fabriquer son ID de session, et l'imposer juste avant le session start !


Preuve qu'ils acceptent vraiment n'importe qui sur php.net.

Christele a écrit :

Au moins tu auras appris quelque chose aujourd'hui, et sera un peut moins pédant.


On se demande qui est pédant...
Modifié par jb_gfx (12 Oct 2012 - 16:50)
Aprés vérification dans la source, je croit qu'on peut annoncer la victoire par KO de jb, ses propos sont tout a fait exactes. chapeau l'artiste.

jb_gfx a écrit :
Non, je l'ai lu (comme à chaque fois que j'ai un doute sur le fonctionnement de PHP) dans le code source de PHP, dans le dossier ext\session, fichier session.c, fonction php_session_create_id().

http://php.net/downloads.php#v5

Tu devrais t'y plonger (si tu sais lire le c) ça t’éviterai de raconter n'importe quoi (comme à ton habitude).


Manquerai plus qu'il faille comprendre pour rédiger les docs, tiens... Des fois je comprends pas ta logique jb xD

Christele a écrit :
Tu écris ici pour te faire valoir, mais en fait ici il vaut mieux écrire pour aider et UNIQUEMENT lorsque ce que l'on avance est fiable.


+1
Modifié par JJK801 (12 Oct 2012 - 16:58)
JJK801 a écrit :
Aprés vérification dans la source, je croit qu'on peut annoncer la victoire par KO de jb, ses propos sont tout a fait exactes. chapeau l'artiste.


J'avais regardé la source avant de poster ma première remarque sur la génération du session id, hein. Smiley smile
jb_gfx a écrit :


J'avais regardé la source avant de poster ma première remarque sur la génération du session id, hein. Smiley smile


Je me demandé aussi ce qui pouvais pousser quelqu'un à se poser cette question Smiley langue
Modérateur
Gaylord.P a écrit :
Merci de ta réponse Smiley smile

Je cherche plus des chaînes de 12/14 caractères, et les résultats de uniqid sont trop successifs, md5 et sha1 beaucoup trop long =S


Un truc comme ça fait pas l'affaire ?

<?php

$t1 = array();
for ($i = 0; $i < 100000; $i++) {    
    $aleatoire = mt_rand(12,14);
    $t1[] = substr(md5(uniqid()),0,$aleatoire);
}

        $t2 = array_unique($t1);
        echo"<pre>";print_r($t2);echo"</pre>";
        $t3 = array_diff_assoc($t1,$t2);
        echo"<pre>";print_r($t3);echo"</pre>";
        $t = array_diff($t2,$t3);
        echo"<pre>";print_r($t);echo"</pre>";

Modifié par niuxe (13 Oct 2012 - 00:58)
Y'a absolument aucune vérification de l'unicité dans ton code. Il vaut mieux utiliser crc ou adler que ton code.
Pages :