8

Teniendo en cuenta lo siguiente:¿Cuál sería un buen esquema de identificación de pedido para una solución de comercio electrónico o un servicio web pago?

a) desea cierta confidencialidad (como no contarle a todos cuántos pedidos ha recibido).

b) desea un dígito de control (por ejemplo, usando el algoritmo Verhoeff) al final para que pueda distinguir fácilmente los errores de ortografía y ayudar a manejar los errores al escanear códigos de barras, si este es el caso.

c) hay que considerar el tiempo para que los consumidores puedan ordenar el orden de los pedidos.

d) ¿Debería ser todo numérico o hexdec, etc.?

e) algo que su consumidor puede decir por teléfono al equipo de soporte y es suficiente para identificar el pedido sin que el personal tenga que solicitar el correo electrónico, etc., por motivos de seguridad.

Me encantaría escuchar algunas opiniones.

PD: cualquier algoritmo diseñado para resolver este problema también se consideraría una respuesta válida para mí.

+0

"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 "¿?" –

+0

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. –

Respuesta

1

¿Qué tal una cadena al azar de cualquier longitud que le parezca? Use caracteres que no se confundan fácilmente con otros caracteres para leer por teléfono. Así que en cada orden de llamada algo así como:

public static string GetRandomString(int length) 
    { 
     char[] chars = "ACDEFGHJKMNPQRTWXY34679".ToCharArray(); 
     var crypto = new RNGCryptoServiceProvider(); 
     var data = new byte[length]; 
     crypto.GetNonZeroBytes(data); 
     var result = new StringBuilder(length); 
     for (int i = 0; i < data.Length; i++) 
     { 
      result.Append(chars[data[i] % chars.Length]); 
     } 

     return result.ToString(); 
    } 

de adivinanzas 8 caracteres devueltos por el método anterior es una oportunidad 1/282429536481. Y mantendrás la integridad en el DB con una restricción única ¿no?

+0

¿qué tal "ordenar el pedido de los pedidos"? – Kevin

+0

Supongo que tendrías un campo OrderDate ¿verdad? – JeremyWeir

0

Puede usar GUID. Para reducirlo a una cadena fácil de usar, valdría la pena ejecutar el valor a través de un convertidor Base32 que daría como resultado una cadena que contiene 26 caracteres de AZ y dígitos 2-7

Para cumplir con otros criterios, puede agregar un verifique el dígito al valor guía, y probablemente necesite un número de orden incremental genuino separado en la base de datos para garantizar la singularidad y permitir la indexación/clasificación natural.

+0

solo necesita los primeros caracteres de GUID para restringir realmente la entrada real, observe cómo Git solo necesita los primeros 4 a 5 caracteres para identificar de manera única una confirmación. solo le pides a los clientes algunos caracteres más hasta que encuentres un fósforo con su nombre. –

5

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.

1

java.util.UUID.randomUUID()

Cuestiones relacionadas