Ir al contenido


Foto

[RESUELTO] Generador de codigos aleatorios


  • Por favor identifícate para responder
7 respuestas en este tema

#1 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 09 octubre 2010 - 07:29

Hola a todos,

Tengo la tarea de generar carnet para prepago de servicios, la idea esta ya concebida, entre una de las cosas se necesita generar seriales e imprimirlos en codigo de barras en cada carnet.  Estoy pensando en un numero de 13 digitos para poder usar el EAN13, tendria que desarrollar un algoritmo que me permita generar seriales que no se repitan.  Mi idea es usar la fecha junto a un correlativo: por ejemplo  0910201000001 que seria ddmmyyyy y un correlativo de 5 cifras encriptados por medio de una clave.

Alguien ha tenido experiencia con esto, o se les ocurre alguna otra cosa?
  • 0

#2 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 09 octubre 2010 - 08:03

Pues si esas 5 cifras restantes pueden ser aleatorias no sería tan complicado generar el valor completo. Y me imagino que ya tienes el algoritmo del EAN13.


Saludos!
  • 0

#3 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 09 octubre 2010 - 08:16

Lo que es no saber :)

http://www.ajpdsoft....article&sid=207

Todos los días se aprende, yo que hacía esto más complicado y mira *-)


Saludos!
  • 0

#4 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 09 octubre 2010 - 08:46

No encuentro una fuente truetype EAN13 que trabaje bien, las CODE39 si lo hacen, por los momentos trabajare entonces con CODE39
  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 09 octubre 2010 - 09:37

Yo lo haría de la siguiente manera. Tendría una base de datos con los números generados, así matamos dos pájaros de un tiro, podemos usar la propia base de datos para generar un id único (autonumerico, gen_id , etc ...) y ademas cuando comprobáramos el numero consultaríamos la base de datos para saber si es valido.

El problema es que ese numero no puede tener valores consecutivos (1000000000001, 1000000000002, 1000000000003, etc ...) por que un listo lo tendría muy fácil para averiguar un numero valido. Así que lo mejor es usar los primeros dígitos del código de barras para el id, un autonumerico por ejemplo, y los últimos números para una función hash. Y si por el listo, ademas de listo, tienen información interna y se hace con el código de la función hash yo le agregaría un par de caracteres aleatorios al final.

En resumen:


delphi
  1. function EAN13(i: int64): String;
  2. var
  3.   j: Integer;
  4. begin
  5.   Result:= Format('%12.12d',[i]);
  6.   j:= 0;
  7.   while i > 0 do
  8.   begin
  9.     inc(j,(i mod 10) * 3);
  10.     i:= i div 10;
  11.     inc(j,i mod 10);
  12.     i:= i div 10;
  13.   end;
  14.   Result:= Result + IntToStr((10 - (j mod 10)) mod 10);
  15. end;
  16.  
  17. const
  18.   Primos: array[1..4] of Cardinal = (13, 17, 19, 23);
  19.  
  20. function Hash(Numero: Cardinal): Cardinal;
  21. var
  22.   i: Integer;
  23. begin
  24.   Result:= 0;
  25.   // Numero primo grande, cambiando este numero personalizamos el hash
  26.   Numero:= Numero * 12589;
  27.   for i:= 1 to 4 do
  28.     Result:= (Result * 10) + ((Numero mod Primos[i]) mod 10);
  29. end;
  30.  
  31. function Generar_Numero(Uid: Integer): String;
  32. var
  33.   i: int64;
  34. begin
  35.   i:= Uid;
  36.   // Despalazamos el Uid hasta su posicion dentro del codigo
  37.   i:= (i mod 1000000) * 1000000;
  38.   // Le añadimos el hash de cuatro cifras
  39.   i:= i + ((Hash(Uid) mod 10000) * 100);
  40.   // y le añadimos dos numeros aleatorios
  41.   i:= i + Random(100);
  42.   // Por ultimo generamos el digito de control
  43.   Result:= EAN13(i);
  44. end;
  45.  
  46. // Por ejemplo
  47. ShowMessage(Generar_Numero(123)):



Y si no dispones de base de datos, siempre puedes comprobar las 6 primeras cifras del código calculando su hash y comparándolo con las 4 cifras siguientes. Asi dispones de un método rápido e inmediato de comprobar un código.
  • 0

#6 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 09 octubre 2010 - 09:53

Me gusta lo del Hash ya que es dificil hacer lo de la BD para comprobar, voy a hacer unas pruebas y comento el resultado.  Gracias.
  • 0

#7 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 09 octubre 2010 - 09:56

Que buen aporte Seoane (y)

Simple y efectivo


Saludos!
  • 0

#8 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 09 octubre 2010 - 10:32

Gracias Seoane, quedo de lujo, ya tengo un generador de seriales jejeje  (h)
  • 0




IP.Board spam blocked by CleanTalk.