Ecco la mia soluzione.
Hanno tre parti x-y-z dove x è il timestamp, y il codice casuale ez è la cifra di controllo prodotta dalla concatenazione di xe y. Ma per semplificare (renderlo più piccolo), xey sono dati in una base personalizzata, invece di base numerica 10, ma z viene comunque fornito alla base 10.
Esempi di ID si possono ottenere con questo approccio:
- LP9NTX-8D41-QW6R-9
- LP9NTY-5H3L-BFS7-5
- LP9NTZ-RWL3-D619-8
- LP9NVB-BW74-788W-6
- LP9NVW-G17D-4911- 8
Quindi è possibile ordinare in base al timestamp (notare come va in un ordine alfanumerico incrementale, se non si conosce esattamente quale sia una base numerica).
Per questo ho usato le cifre + lettere maiuscole di base58 (alla fine non importa se ho usato lettere minuscole o superiori), che è base62 senza alcuni caratteri confusi. Flickr, bit.ly and others use base58 for making Twitter 'friendly' links and the like.
Il Verhoeff :: calcsum in basso è Verhoeff’s Dihedral Group D5 Check by Dahnielson. L'unico montaggio che ho apportato è stato inserire il suo codice in una classe, quindi è lo stesso.
Ecco il codice: (* un po 'modificato da quello che ho promesso le linee up there ^)
<?php
$time_divisor = 3;
$base = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ";//consider using another base **see note below**
$lower_limit = 50000;//just to avoiding to confuse the user with a lower number
$upper_limit = 1291467968;//1291467968 == ZZZZZZ in this base I used
//you can check the limit with base_decode("ZZZZZZ", $base);
$ptime = (int)($_SERVER['REQUEST_TIME']/$time_divisor);//or time();
$rand1 = mt_rand($lower_limit, $upper_limi);
$rand2 = mt_rand($lower_limit, $upper_limi);
$ptime_b = base_encode($time, $base);
$rand1_b = base_encode($rand1, $base);
$rand2_b = base_encode($rand2, $base);
$order_id = $ptime_b.$rand1_b.$rand2_b.Verhoeff::calcsum($time.$rand1.$rand2);
echo $order_id;
?>
Subito dopo ho finito di scrivere questo altro, eventualmente, di cose che vanno male è venuto in mente. Mi sono ricordato che non vuoi che i tuoi consumatori si sentano insultati. Quindi anche le pessime parole come 'f? Ck' o '4ss' alla fine appaiono forse ok (e quasi certamente lo faranno), le parole esplicite (come nel cambiare il '4' per 'a' nella parola precedente) non sono sicuramente . A causa di questo vi consiglio di usare la seguente base alternativo/UPPER_LIMIT invece:
<?php
$lower_limit = 27000;//=2111
$upper_limit = 809999;//=ZZZZ
$base = "123456789BCDFGHJKLMNPQRSTVWXYZ";//erased -a -e -u
?>
Si prega di notare che se si tenta di utilizzare i numeri più grandi si arriva limite int superiore di PHP, così come il limite mt_rand, che può essere visto con mt_getrandmax(). Inoltre, vorrei dire che per quello che vedo l'entropia di mt_rand è sufficiente.
Se avete bisogno di numeri più grandi per la parte casuale, vi consiglio di aggiungere una terza parte a qualcosa con qualcosa come mt_rand (i, j); dove i e j sono i valori minimo e massimo per la tua base che aumenteranno il tuo ID ordine in lunghezza $ num-chars (in realtà ho fatto questo, w/la configurazione di cui sopra).
E sul lato DB è un campo unico per evitare collisioni.
Grazie a tutti.
"un PHP o MySQL pezzo di codice progettato per risolvere questo problema sarebbe considerato una valida risposta per me" - è che un altro modo di dire "pls sendz teh codez "? –
No, ma se c'è qualcuno là fuori che ha fatto un algoritmo che risolve questo mi piacerebbe molto. Ho modificato il testo per evitare che qualcun altro pensi male alle mie intenzioni. –