2009-07-24 17 views
14

Cada orden en mi tienda en línea tiene un número de orden de usuario. Me pregunto cuál es la mejor forma de generarlos. Los criterios incluyen:¿La mejor manera de generar números de pedido para una tienda en línea?

  • corto
  • fácil decir a través del teléfono (por ejemplo, "m" y "n" son ambiguos)
  • único
  • suma de comprobación
  • (exageración Útil??) Editar: No revela cuántos pedidos totales ha habido (un cliente puede encontrar que es inquietante hacer su 3er pedido)

Rig Ahora estoy usando el siguiente método (sin suma de comprobación):

def generate_number     
    possible_values = 'abfhijlqrstuxy'.upcase.split('') | '123456789'.split('') 

    record = true 
    while record 
     random = Array.new(5){possible_values[rand(possible_values.size)]}.join 
     record = Order.find(:first, :conditions => ["number = ?", random]) 
    end   
    self.number = random 
end 
+0

Eso estaría bien por un tiempo, pero después de que hay un montón (una cantidad real, real) de Pedidos, las posibilidades de generar una ID única se reducen progresivamente ... Creo que enviaré una respuesta para ayudar fuera ... – nilamo

+0

el cliente podría pensar que los números de pedido son exclusivos de él/ella, así que no me preocuparía. Es una tontería preocuparse por IMO – Tim

Respuesta

13

Como cliente estaría contento con:

year-month-day/short_uid 

por ejemplo:

2009-07-27/KT1E 

Da ambiente durante aproximadamente 33^~ 4 órdenes 1mln al día.

+4

Año sin texto '2', día del año y 4 caracteres al azar (por ejemplo, 9-256-KT1E), eso es suficiente para 1 millón de pedidos todos los días durante 999 años, ¿cómo es eso? – Chris

+2

Esa es una muy buena manera de hacerlo, así como escanear el número de pedido para la fecha de compra dentro de la propia identificación. Escogería ser un poco más oscuro, un poco más como un código de venta minorista, y soltar los tokens, solo: 20090727KT1E. – axiom82

+0

Solo deja espacio para un pedido por cliente por día, aunque – Phil

0

Secuencialmente, comenzando en 1? ¿Qué está mal con eso?

. (Nota: Esta respuesta fue dada antes de la OP editado la pregunta)

+0

Ver mi edición - No quiero revelar qué tan nueva es mi tienda para mis clientes. –

+0

Secuencialmente, comenzando en 1234? ;) – John

+0

Los clientes o, lo que es más importante, la competencia, pueden ver cómo puede ordenar su procesamiento durante un período de tiempo. – FlappySocks

2

En mi antiguo lugar era la siguiente:

El ID de cliente (que comenzó en 1001), la secuencia de la orden que hicieron entonces la identificación única de la tabla Pedidos. Eso nos dio un buen número largo de al menos 6 dígitos y fue único debido a las dos claves principales.

Supongo que si pone guiones o espacios en usted hasta podría obtener una pequeña idea de los hábitos de compra del cliente. No es alucinante seguro y supongo que una ID de pedido sería adivinable, pero no estoy seguro de si hay riesgo de seguridad en eso o no.

0

Bien, ¿qué tal este?

Secuencialmente, comenzando en un número (2468) y agregando otro número, digamos el día del mes en que se realizó el pedido.

El número siempre aumenta (hasta que exceda la capacidad del tipo entero, pero para entonces probablemente no le importe, ya que será increíblemente exitoso y estará sorbiendo margaritas en algún paraíso lejano de la isla). Es lo suficientemente simple de implementar, y mezcla las cosas lo suficiente como para evitar cualquier adivinanza en cuanto a la cantidad de pedidos que tiene.

1

Algo como esto:

  1. obtener el número de orden secuencial. O, tal vez, una marca de tiempo de UNIX más dos o tres dígitos aleatorios (cuando dos órdenes se colocan en el mismo momento) también está bien.
  2. Bitwise-XOR con algún valor semisecreto para que el número parezca "pseudoaleatorio". Esto es primitivo y no detendrá a los que realmente quieran investigar cuántas órdenes tiene, pero para verdadero "aleatoriedad" necesita mantener una tabla de permutación (grande). O tendrá que tener números grandes al azar, por lo que no será golpeado por la paradoja del cumpleaños.
  3. Add checkdigit usando Verhoeff algorithm (No estoy seguro de que tenga tan buenas propiedades para base33, pero no debería ser malo).
  4. Convierte el número a, por ejemplo, base 33 ("0-9A-Z", excepto "O", "Q" y "L" que se puede confundir con "0" y "1") o algo como eso.La facilidad de pronunciación significa excluir más letras.
  5. Agrupe el resultado en un patrón legible visualmente, como XXX-XXX-XX, para que los usuarios no tengan que rastrear la posición con los dedos o con los punteros del mouse.
-2

¿Qué le parece obtener la hora actual en milisegundos y usarla como su ID de pedido?

0

Sólo una idea de Rube Goldberg de estilo:

Se podría generar una tabla con un conjunto aleatorio de números que está ligado a un período de tiempo aleatorio:

Time Period   Interleaver 
next 2 weeks:  442 
following 8 days: 142 
following 3 weeks: 580 

y así sucesivamente ... esto le proporciona un número ilimitado de Intercaladores, y no le permite a nadie conocer su tasa de pedidos porque sus períodos de tiempo podrían ser del orden de días y su intercalador está haciendo un montón de "trituración" de baja tecnología para usted.

Puede generar esta tabla una vez y simplemente asegurarse de que todos los entrelazadores sean únicos. Puede asegurarse de que no se quede sin Intercaladores simplemente agregando más caracteres en el conjunto, o empiece definiendo Intercaladores más largos.

Para generar un ID de pedido obteniendo un número secuencial, y utilizando el valor del Interleaver de hoy, intercalar sus dígitos (por lo tanto, el nombre) entre los dígitos de cada número secuencial. Garantizado único: garantizado confuso.

Ejemplo:

Today I have a sequential number 1, so I will generate the order ID: 4412 
The next order will be 4422 
The next order will be 4432 
The 10th order will be 41402 

In two weeks my interleaver will change to 142, 
The 200th order will be 210402 
The 201th order will be 210412 

Eight days later, my interleaver changes to 580: 
The 292th order will be 259820 

Este será completamente confuso pero completamente determinista. Puedes eliminar cualquier otro dígito empezando en el lugar del 1. (excepto cuando su ID de pedido es solo un dígito más que su intercalador)

No dije que esta fuera la mejor manera, solo una idea para el viernes.

1

Prefiero enviar el número 347 y obtener un excelente servicio al cliente en un sitio más pequeño y agradable que: G-84e38wRD-45OM en el mega-sitio y ser ignorado por una semana.

Usted no querría esto como una identificación del sistema o como parte de un enlace, pero como un número fácil de usar funciona.

3

Aquí es una implementación de un sistema que proposed in an earlier question:

MAGIC = []; 
29.downto(0) {|i| MAGIC << 839712541[i]} 

def convert(num) 
    order = 0 
    0.upto(MAGIC.length - 1) {|i| order = order << 1 | (num[i]^MAGIC[i]) } 
    order 
end 

Es sólo una función hash barato, pero hace que sea difícil para un usuario medio para determinar cuántos pedidos se han procesado, o un número de otra orden No se quedará sin espacio hasta que haya realizado los pedidos de 2 , que no recibirá pronto.

Éstos son los resultados de convert(x) de 1 a 10:

1: 302841629 
2: 571277085 
3: 34406173 
4: 973930269 
5: 437059357 
6: 705494813 
7: 168623901 
8: 906821405 
9: 369950493 
10: 638385949 
0

que podría hacerlo como un código postal: 2b2 B2B

De esta manera se tiene una especie de suma de control (no realmente, pero al menos sabes que está mal si hay 2 números o letras consecutivos). Es fácil de leer por teléfono, y no da una indicación de cuántos pedidos hay en el sistema.

2

En lugar de generar y almacenar un número, es posible que trate de crear una versión encriptada que no revelaría el número de pedidos en el sistema. Here's an article en exactamente eso.

+0

¿Es obfuscado que los ID de enteros, tal como se presentan en el enlace que ha publicado, todavía se consideran seguros y están de acuerdo en usarlos ahora? – user2049132

1

Douglas Crockford's Base32 Encoding funciona muy bien para esto.

http://www.crockford.com/wrmg/base32.html

almacenar el ID de sí mismo en su base de datos como un número entero de incremento automático, a partir de algo adecuadamente grande como 100.000, y simplemente exponer el valor codificado para el cliente/interfaz.

5 caracteres lo llevarán a través de sus primeros ~ 32 millones de pedidos, mientras se desempeña muy bien y satisface la mayoría de estos requisitos. Sin embargo, no permite la exclusión de caracteres que suenan similares.

Cuestiones relacionadas