Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    controllare se un codice casuale esiste

    salve ragazzi.

    attraverso il seguento codice, creo una stringa casuale.
    codice:
    $date = date("Y-m-d H:i:s");  
     $n= 7 ; 
      $link_code = substr(md5($data),0,$n);
    questo codice poi lo inserisco nel database.

    domanda.

    vorrei poter controllare prima di inserire il codice generato, che questo non sia gia presente nella tabella, altrimenti creare un nuovo codice e ripetere il controllo fino a che sono sicuro che il codice non sia gia presente.

    potete suggerirmi come?

    grazie.

  2. #2
    Potresti utilizzare un do-while.

    Pseudo codice:

    do{
    // creo la stringa random

    if( la stringa non è nel database ){
    //la memorizzo nel database
    return
    }

    }while( la stringa è nel database )

  3. #3
    dici che una cosa cosi puo andare bene?

    Codice PHP:
    do{
    ################################
    $code substr($better_token7);
    ################################
    //qui query per controllare se il codice esiste

    if($check_code==''){
    //faccio queryiper inserire il record
    return;
    }

    }while( 
    $code == $row_check_code ); 

  4. #4
    Buttandolo giù così volocemente e senza pensarci un attimo mi verrebbe da consigliarti questo:


    Codice PHP:

    $n
    ;

    do{
    $date date("Y-m-d H:i:s");  
    $link_code substr(md5($data),0,$n);

    $code substr($better_token7); 

    // qui la query di ricerca
    $founded // qui la query per il controllo del numero delle righe individuate query_num_rows

    if($founded 1){
    // qui la query per inserire la stringa nel database
    return
    }

    }while(
    $founded 0); 
    vi è però un problema di fondo:

    il webserver esegue diversi cicli in un secondo.
    Con il codice per generare la stringa casuale in un secondo avresti sempre la stessa stringa casuale generata.

    Pensa a questo:
    il tuo ciclo do while in un secondo esegue, ad esempio, 50 cicli.
    La data generata per questi 50 cicli sarà sempre 2010-09-12 12:50:10 per la stessa data e l'md5 e la troncatura sarà, di conseguenza, sempre la stessa per tutti i cicli eseguiti nella stessa data.

    Ciò significa che devi cambiare il modo di generare la stringa (sicuramente non utilizzando la funzione date()). Questo perchè? Se per disgrazia quella stringa è già presente nel database il ciclo do-while eseguirà tanti controlli sul dabatase ma quelli effettivamente utili saranno quelli associati alla stringa generata ogni nuovo secondo. Il tuo ciclo sicuramente rallenta il tutto di un secondo (che non è poco).

  5. #5
    grazie a Dio forse inizio a capirci qualcosa di php, perche mi é venuto il tuo stesso dubbio smanettando.

    ora genero il codice con:

    Codice PHP:
    $str md5(uniqid(rand(), true)); $code substr($str7); 
    a quanto ho letto su diversi siti credo che sia la soluzione migliore.

    grazie mille!

  6. #6
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Usa il microtime come seme per un numero random .

  7. #7
    a voler fare i precisi una funzione di hash come md5 (a 128 bit/32 bytes) prevede cmq delle collisioni (ovvero partendo da stringhe diverse si ottiene lo stesso hash) quindi per minimizzare questo rischio o aumenti l'entropia della stringa da cui partire (come suggerito aggiungendo l'orario fino ai microsecondi dell'istante in cui viene eseguito l'hash e/o aggiungendo una cifra casuale calcolata da php) oppure cambi algoritmo per calcolare l'hash andando su funzioni che generano un hash più esteso, ad esempio sha1() oppure una funzione più generica come hash() ( http://www.php.net/manual/en/function.hash.php mentre qui una lista degli algoritmi che hai a disposizione http://www.php.net/manual/en/function.hash-algos.php )

  8. #8
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    vero che hai collisioni e quindi e' anche giusto controllare che il codice non esista.

    Cmq quel cicolo verra' eseguito ....... quasi mai, pero' anche se dovesse essere eseguito 1 volta sola deve essere tenuto in considerazione.

    E' in ciclo non invasivo e se il codice viene generato con un seed caricato con microtime poi controllato ed eventualmente rigenerato ( cosa che io faccio sempre con queste necessita' ) vai tranquillo che non ci saranno problemi a livello algoritmico .

    Sarebbe interessante magari traciare quanto spesso questo capita ..... .

    In java per trovare 1 collisione sull'algoritmo di hashing ( quello interno di Java ) ho fatto scansioni su una cosa come 100/200 mila stringhe casuali. Forse anche di piu' comunque giusto per darti un ordine di grandezza, quel test l'ho fatto una cosa come 3 anni fa

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.