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?

[RESUELTO] Generador de codigos aleatorios
Comenzado por
eduarcol
, oct 09 2010 07:29
7 respuestas en este tema
#1
Escrito 09 octubre 2010 - 07:29
#2
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!
Saludos!
#3
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!

http://www.ajpdsoft....article&sid=207
Todos los días se aprende, yo que hacía esto más complicado y mira

Saludos!
#4
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
#5
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:
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.
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
function EAN13(i: int64): String; var j: Integer; begin Result:= Format('%12.12d',[i]); j:= 0; while i > 0 do begin inc(j,(i mod 10) * 3); i:= i div 10; inc(j,i mod 10); i:= i div 10; end; Result:= Result + IntToStr((10 - (j mod 10)) mod 10); end; const Primos: array[1..4] of Cardinal = (13, 17, 19, 23); function Hash(Numero: Cardinal): Cardinal; var i: Integer; begin Result:= 0; // Numero primo grande, cambiando este numero personalizamos el hash Numero:= Numero * 12589; for i:= 1 to 4 do Result:= (Result * 10) + ((Numero mod Primos[i]) mod 10); end; function Generar_Numero(Uid: Integer): String; var i: int64; begin i:= Uid; // Despalazamos el Uid hasta su posicion dentro del codigo i:= (i mod 1000000) * 1000000; // Le añadimos el hash de cuatro cifras i:= i + ((Hash(Uid) mod 10000) * 100); // y le añadimos dos numeros aleatorios i:= i + Random(100); // Por ultimo generamos el digito de control Result:= EAN13(i); end; // Por ejemplo 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.
#6
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.
#7
Escrito 09 octubre 2010 - 09:56
Que buen aporte Seoane 
Simple y efectivo
Saludos!

Simple y efectivo
Saludos!
#8
Escrito 09 octubre 2010 - 10:32
Gracias Seoane, quedo de lujo, ya tengo un generador de seriales jejeje
