Aquí está mi solución.
Tiene tres porciones x-y-z donde x es la marca de tiempo, y el código aleatorio y z es el dígito de verificación producido por la concatenación de xey. Sin embargo, para simplificar (hacerlo más pequeño), X e Y se da en una base personalizado, en lugar de base numérica 10, pero todavía z se da en la base 10.
Ejemplos de identificadores, usted puede obtener con este enfoque:
- LP9NTX-8D41-QW6R-9
- LP9NTY-5H3L-BFS7-5
- LP9NTZ-RWL3-D619-8
- LP9NVB-BW74-788W-6
- LP9NVW-G17D-4911- 8
Para que pueda ordenar por la marca de tiempo (observe cómo va en 'una orden alfanumérica incremental', si no sabe exactamente qué base numérica es).
Para esto utilicé los dígitos + letras mayúsculas de base58 (al final no importará si usé en minúscula o superior), que es base62 sin algunos caracteres confusos. Flickr, bit.ly and others use base58 for making Twitter 'friendly' links and the like.
Verhoeff :: calcsum a continuación es Verhoeff’s Dihedral Group D5 Check by Dahnielson. La única edición que hice fue poner su código dentro de una clase, por lo que es lo mismo.
Aquí hay un código: (* algo modificada de lo que he prometido en las líneas de allí arriba ^)
<?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;
?>
Justo después de terminar de escribir esta otra, posiblemente, de las cosas van mal vino a la mente. Recuerdo que no quieres que tus consumidores se sientan insultados. Así que incluso pensé que malas palabras como 'f? Ck' o '4ss' aparecían tal vez bien (y casi seguro que lo harán), las palabras explícitas (como cambiar el '4' por 'a' en la palabra anterior) definitivamente no . Debido a esto te recomiendo que utilice la siguiente base alternativo/UPPER_LIMIT lugar:
<?php
$lower_limit = 27000;//=2111
$upper_limit = 809999;//=ZZZZ
$base = "123456789BCDFGHJKLMNPQRSTVWXYZ";//erased -a -e -u
?>
Tenga en cuenta que si intenta utilizar números más grandes que usted llegar a int limite superior de PHP, así como el límite mt_rand, lo que puede ser visto con mt_getrandmax(). Además, me gustaría decir que por lo que veo la entropía de mt_rand es suficiente.
Si necesita números más grandes para la parte aleatoria, le recomiendo que añada una tercera parte a algo como mt_rand (i, j); donde i y j son los valores mínimos y máximos para su base que aumentarán su id del pedido en $ núm-caracteres de longitud (de hecho hice esto, con la configuración anterior).
Y en el lado DB es un campo único para evitar colisiones.
Gracias a todos.
"un PHP MySQL o una pieza de código diseñado para resolver este problema sería considerado una respuesta válida para mí" - que es otra forma de decir "pls sendz teh codez "¿?" –
No, pero si hay alguien por ahí que hizo un algoritmo que lo resuelve de una manera agradable, me gustaría. He editado el texto para evitar que alguien más piense mal sobre mis intenciones. –