IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Fonctionnement de srand() et mt_srand()


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Fonctionnement de srand() et mt_srand()
    Bonjour à tous,
    Récemment je me suis intéressé à la génération de nombres pseudo-aléatoires et une petite question m'est venue alors que je parcourais le manuel PHP.
    On peut y lire :
    Citation Envoyé par php.net/rand
    4.2.0 Le générateur de nombres aléatoires est initialisé automatiquement.
    et :
    Citation Envoyé par php.net/srand
    Depuis la version 4.2.0 Le paramètre seed est devenu optionnel et vaut, par défaut, une valeur aléatoire si omis
    Donc si j'appelle : rand(); derrière le générateur de nombre va être automatiquement initialisé via srand($graine).
    Et $graine va être une valeur aléatoire. Sauf que c'est un cercle vicieux! $graine ne peut pas être calculé via rand(), donc comment est-elle calculée?
    Je vous pose cette question car je n'ai aucune idée d'où aller chercher ma réponse... Peut-on avoir accès aux sources pour directement regarder le code de la fonction srand() (et pareil pour mt_srand()) ?

    Merci à vous,

    ++

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut rep
    Personnellement je pense que tu ne vas pas trouvé. Car c'est des fonctions faîtes en code machine. Nous, on ne peut que manipuler la fonction, en fonction des paramètres du concepteur.

    c'est idem pour

    md5()
    rand();
    unique(rand());

    C'est quasiment impossible à moins d'être programmeur machine. Donc tu n'auras que les explications pour les faire fonctionner.

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le problème n'est pas limité a PHP.
    Tu peux te documenter plus globalement sur le sujet :
    http://fr.wikipedia.org/wiki/G%C3%A9...l%C3%A9atoires

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Si je posais cette question c'est évidemment que je m'étais documenté. J'ai lu cet article sabotage et pas mal d'autres.

    J'ai finalement réussi à me procurer les sources PHP et j'ai donc pu voir comment se fait le seed.

    @carmen256: détrompe toi, le code source de toutes les fonctions que tu cites est disponible et ouvert à tous!

    ++

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si je posais cette question c'est évidemment que je m'étais documenté
    Je t'invite a participer a des forums sur internet sur n'importe quel sujet (medical, animalier, technique) pour constater que le lien logique entre les deux assertions est plus que faux.

    Qu'a donné ta lecture du code ?

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 121
    Points : 136
    Points
    136
    Par défaut
    L'utilisation de srand() est depuis bien longtemps, obsolète...
    De plus, mt_rand() est toujours mieux que rand() !

    mt_rand() et rand() calcule une valeur aléatoire en fonction du timestamp actuel et de la dernière valeur qu'elles ont renvoyées (d'où l'ex-nécessité de l'initialiser).

    Les sources sont en C, non?

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Ouaip, je sais comment les deux fonctions marchent. Après avoir tout passer en revue les sources (qui sont en C effectivement) je suis quasiment incollable

    srand() et mt_srand() sont automatiquement initialisés via une macro GENERATE_SEED() que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef PHP_WIN32
    #define GENERATE_SEED() (((long) (time(0) * GetCurrentProcessId())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))
    #else
    #define GENERATE_SEED() (((long) (time(0) * getpid())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))
    #endif
    Le seed dépends donc du process ID, du timestamp actuel et de la fonction php_combined_lcg qui est en réalité un autre générateur de nombres pseudo-aléatoires basé sur les congruences. Cette fonction renvoie un nombre compris entre 0 et 1, si vous souhaitez faire des tests, vous pouvez directement l'utiliser dans vos code PHP via la fonction lcg_value().
    La fonction GENERATE_SEED() est différente dans les versions PHP inférieures à 5.2.6, une faille a été trouvée dans cette fonction et les développeurs ont donc du la changer. Pour plus d'informations, vous pouvez consulter l'advisory de Stefan Esser qui traite de ce sujet.

    mt_srand() et srand() obsolètes? D'un point de vue sécuritaire en étudiant en profondeur tout ça on se rends compte que non. Mais ça c'est une autre histoire !

  8. #8
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Vu que les sources sont disponible pour chaque fonctions, rien empêche de créer ses propres fonctions et de les compiler.
    C'est très intéressant si on à un pur dédié, personnellement c'est toujours bien d'être au courant de l'origine des fonctions (faut en avoir le temps).
    J'ai pensé à un moment de créer une combinaison des hash disponible ainsi que des crypts mais c'est vraiment pour s'amuser .
    la fonction hashtordu5()

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2003, 16h51
  2. Réponses: 5
    Dernier message: 14/05/2003, 14h51
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo