2012-01-05 16 views
6

dire se volevo dare ad ogni utente che ha registrato sul mio sito un ID univoco. Mi sembra che se volessi farlo dovrei: Creare un numero casuale per l'id, controllare se quell'id esiste già nel database, se esiste, quindi creare un altro numero casuale e inviare ancora un'altra query per vedere se esiste, e così via ...PHP & mySQL (i): come generare un ID utente casuale?

Questo potrebbe andare avanti per secoli. Oltre ad avere un ID incrementale, c'è qualche modo decente per farlo?

+2

Perché non semplicemente utilizzare un campo AUTOINCREMENT? Gli utenti hanno davvero bisogno (o cura) di avere qualche hash complicato che li identifica, specialmente se è qualcosa che non hanno mai bisogno di vedere? –

+0

usa un campo autoincrement come chiave primaria. questo è praticamente quello che fanno tutti. – dqhendricks

+0

beh sarà usato nell'URL come? Id = ##### e volevo essere avventuroso :-) –

risposta

2

Il modo migliore per farlo è tramite la funzione di incremento automatico, se davvero non si desidera utilizzare una funzione come è possibile utilizzare uniqid();

Fondamentalmente si genera un ID univoco basato su millisecondi, se si inserisce un prefisso univoco nella funzione genererà un ID univoco.

echo uniqid('prefix'); 

In questo modo non è necessario verificare dopo aver generato un ID, se già esiste o no. Puoi essere sicuro che è unico.

Per ulteriori informazioni, controllare questo URL http://php.net/uniqid!

+1

+1 UNIQID è molto, molto improbabile che generi una collisione –

+0

se qualcuno dovesse registrarsi allo stesso tempo, non lo farei essere avvitato?; p lol –

+1

No, utilizzare semplicemente un prefisso casuale, ad esempio: uniqid (rand(), true). Molto improbabile che accada! – Wesley

0

Se si dispone di una stringa di 15 numeri che si stanno osservando fino a 999 miliardi di dollari, dubito che verrà eseguito per "età" considerando che ci sono quasi 7 miliardi di persone sul pianeta.

+0

significa miliardo di persone, non trilioni di persone –

+1

Haha, mi sono preso così in trilioni - grazie! modificato – Michael

1

È possibile utilizzare la funzione rand(). Genera un numero casuale tra due.

rand(0000,9999) 

Si genera un numero compreso tra 0 e 9999.

Per verificare se esiste già:

$id = rand(0000,9999); 

/* CREATE YOUR MYSQL CONNECTION */ 
$user_list = mysql_query("SELECT * FROM users"); 
while ($user = mysql_fetch_array($user_list)) 
{ 
    if ($id == $user['id']) 
    { 
     echo('Already exist.'); 
    } 
    else 
    { 
     /* YOUR CODE */ 
    } 
} 

E 'il modo in cui l'ho fatto ...

+0

È meglio usare invece 'mt_rand'; per i numeri con più casualità ed è anche più veloce. – Matthew

+1

Ha bisogno che l'ID utente sia unico. Dovresti aggiornare la tua risposta per dimostrare come ciò potrebbe essere fatto. –

+0

In effetti, ma è più semplice usare rand() ... Penso ... conosco questa funzione perché lo uso per il mio blog ID ... –

1

Prima di tutto, sono d'accordo con i commenti. È tutto il codice di testa, e se lo stai usando per renderlo interessante, dovresti davvero riconsiderare le tue priorità.

Ma se ne hai ancora bisogno; Ecco un piccolo qualcosa:

function uid() { 
    mt_srand((double)microtime()*1000000); 
    $token = mt_rand(1, mt_getrandmax()); 

    $uid = uniqid(md5($token), true); 
    if($uid != false && $uid != '' && $uid != NULL) { 
     $out = sha1($uid); 
     return $out; 
    } else { 
     return false; 
    } 
} 

Fondamentalmente, si fa un sacco di generare numeri casuali per creare un token per uniqueid, e poi è sha è tutto. Probabilmente sovraccarico, ma puoi essere sicuro di non generare mai un doppio uid.

Fabian.

+0

Ho provato il tuo codice e genererà 40 caratteri (forse sempre). Come se volessi generare solo 15 o 20 caratteri? – RiefSapthana

0

L'ID deve essere numerico? Passando ai caratteri alfabetici si otterrà un lotto più entropia. Un numero di 6 cifre è 1.000.000 di possibilità, una stringa alfanumerica di 6 caratteri è di 2.176.782.336 possibilità. Rendilo misto alfanumerico e quello salta a 15.625.000.000.

Ecco come io di solito generare stringhe unici che sono il più breve possibile:

$chars = 'abcdefghijklmnopqrstuvwrxyzABCDEFGHIJKLMNOPQRSTUVWRXYZ'; 
mt_srand((double)microtime()*1000000); 

$id = ''; 
do { 
    $id .= $chars[mt_rand(0, strlen($chars) - 1)]; 
} while (isIdTaken($id)); 

var_dump($id); 

È necessario creare un sacco di oggetti con questo stile di id, prima si arriva a più di 3 o 4 caratteri.

0

so che è tardi per questa risposta, ma la soluzione più semplice è quello di generare numeri casuali e sicuro che sarà unico al 100% è

$uid = uniqid().date("Ymdhhis"); 
Problemi correlati