Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [hash] Roba strana!

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39

    [hash] Roba strana!

    Allora.. ho scritto un semplice codice per "vedere" se e quanti duplicati ottengo facendo 10000 hash consecutivi.
    Se avete un paio di minuti, provate a fare un test. Poi mi dite che ne pensate.

    Codice PHP:
    <pre>

    <?
    $arr
    =array();

    for (
    $i=0$i<10000$i++) {
        
    $n=hash('crc32',uniqid(),false);

        
    $find=array_search($n,$arr);
        if (
    is_numeric($find))       echo "found: ".$n."\tindex: ".$i."\n";

        
    $arr[]=$n;
    }

    print_r($arr);
    ?>

    </pre>


    In 2/3 test, dovreste ricevere qualche messaggio del tipo:

    codice:
    found: 0e838051    index: 6979


    Adesso provate a fare un "find" (dal browser") e cercate il "codice" trovato
    (in questo caso "0e838051")

    Secondo il mio codice, dovrebbero esserci PIU' di 1 risultato.
    Invece io ne trovo SOLO UNO!
    Come è possibile che venga stampato il "found"?
    Il mio codice è sbagliato??

    Ditemi che ne pensate, che ci facciamo due risate

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Se fai un print 0e838051; PHP scrive 0. La e viene interpretata come una specie di "esponente".
    - Se fai print 10e3 ti stampa 10000
    - Se fai print 2e3 ti stampa 2000
    - Se fai print 0e10 ti stampa 0

    Nell'array hai al posto 6979 il valore 0e838051 cioè 0
    In n hai un valore dello stesso tipo per esempio 0e123456. Siccome dà 0 allora ti trova un riscontro nell'array.

    Noterai che hai una stampa soltanto con dei valori del tipo 0exxxxxx.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39
    Ho capito... allora ho provato cosi':


    Codice PHP:
    $n=strval(hash('crc32',uniqid(),false)); 

    eppure non funziona!!
    tu come lo risolveresti??

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39
    Per ora ho pensato di aggiungere un prefisso "ID-".. almeno in questo modo dovrebbe trattarlo come una stringa :P

    Codice PHP:
    <pre>
    <?
    $arr
    =array();

    for (
    $i=0$i<10000$i++) {
        
    $n=hash('crc32',uniqid(),false);
        
    $str='ID-'.$n;

        
    $find=array_search($str,$arr);
        if (
    is_numeric($find))       echo "found: ".$str."\tindex: ".$i."\n";

        
    $arr[]=$str;
    }

    print_r($arr);
    ?>
    </pre>

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39
    Allora.. ho trovato una soluzione (CREDO)....
    Facciamo due test di "comparison":

    Codice PHP:
    '0e550959' == '0e340447' )    => true
    '0e550959' === '0e340447' )    => false 

    Quindi bisogna usare una comparison STRICT
    percio' basta aggiungere un terzo parametro true

    Codice PHP:
    array_search($n,$arr,true
    o
    Codice PHP:
    in_array($n,$arr,true

    spero di non sbagliarmi ANCORA ...

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39
    Cmq, a pensarci bene, questo comportamento potrebbe portare diversi problemi.
    Ad esempio, immagina che un utente abbia creato un password del genere:

    "0e536863"

    e mettiamo che qualcuno provi a inserire questa password:

    "0e192493"

    se non si effettua una comparazione "strict", il sistema potrebbe considerare la pwd VALIDA, anche se non lo è!

    E chissà quanti altri problemi ci potrebbero essere..
    Mi sa che d'ora in poi usero' sempre comparazioni strict "a 3 uguali" (===)

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39
    E "dulcis in fundo", un modo ESTREMAMENTE più veloce per trovare eventuali duplicati, usando

    Codice PHP:
    array_count_values($arr

    che sembra usare già di per se una comparazione STRICT
    quindi l'algoritmo diventa:

    Codice PHP:
    <pre>
    <?
       $arr
    =array();
       for (
    $i=0$i<10000$i++) {    
          
    $n=hash('crc32',uniqid(),false);
          
    $arr[]=$n;
       }

       
    $dups = array();
       foreach(
    array_count_values($arr) as $val => $c)
          if(
    $c 1$dups[] = $val;

       echo 
    'DUPLICATES:'print_r($dups);
       echo 
    'DATA:'print_r($arr);
    ?>
    </pre>

    Davvero "performante"

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2015
    residenza
    TORINO
    Messaggi
    37
    Da php >5.5 ci sono queste funzioni password_hash e password_verify . Se usi quelle, non avrai questo problema, oltre a essere il metodo più sicuro (raccomandato da Rasmus a php Verona 2014):
    codice:
    $h1 = password_hash('0e536863', PASSWORD_DEFAULT);
    $h2 =  password_hash('0e192493', PASSWORD_DEFAULT);
    var_dump(password_verify('0e536863', $h1));
    var_dump(password_verify('0e536863', $h2));
    Vedrai che è true solo nel primo caso.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.