Es muy útil a la hora de generar claves de acceso y/o cadenas de licencias, etc. Los cambios efectuados están básicamente en la semilla que se le pasa a la función RAND, evitando así que en cadenas similares de caracteres se generen claves similares. En esta clase, el RAND se inicializa con el valor de la suma de chequeo (función SYS(2007)) divido por la longitud de la cadena deseada.
La clase es la siguiente.
DEFINE CLASS GenKey AS CUSTOM HIDDEN Caracteres HIDDEN LenCarac Caracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" LenCarac = LEN( THIS.Caracteres ) PROCEDURE GenKey( lsString AS STRING, lnLong AS INT ) AS STRING LOCAL lnLenString LOCAL lnInt LOCAL lsReturn lsReturn = "" IF TYPE( "lnLong" ) != "N" lnLong = 8 ENDIF IF TYPE( "lsString" ) != "C" RETURN lsReturn ELSE lnLong = IIF( lnLong >= 10, 10, lnLong ) RAND( INT( VAL( SYS( 2007, lsString ) ) / lnLong ) ) FOR lnCont = 1 TO lnLong lsReturn = lsReturn + SUBSTR( THIS.Caracteres, RAND() * THIS.LenCarac + 1, 1 ) ENDFOR ENDIF RETURN lsReturn ENDPROC ENDDEFINEActualmente está diseñada para generar llaves de 8 caracteres por defecto, y hasta 10 máximo. Se puede extender a cualquier límite. La forma de utilizarla es..
oKey = CREATEOBJECT("GenKey") ? oKey.GenKey("MiTexto", 8) RELEASE oKey
Mario Cerón Charry
Nota del editor: Para que los valores retornados por la función RAND() sean lo mas aleatorio posible tener en cuenta la ayuda de la función en la documentación de Visual FoxPro:
Sintaxis:
RAND([nSeedValue])
Parámetros
nSeedValue: Especifica el valor Seed que determina la secuencia de valores que devuelve RAND().
RAND() devuelve la misma secuencia de números aleatorios si utiliza el mismo valor Seed para nSeedValue la primera vez que ejecuta la función RAND(), seguida de llamadas posteriores a la función RAND() sin nSeedValue.
Si nSeedValue es negativo la primera vez que ejecuta RAND(), se usará un valor Seed a partir del reloj del sistema. Para obtener la serie más aleatoria de números, utilice inicialmente RAND() con un argumento negativo y después, ejecute RAND() sin ningún argumento.
Si omite nSeedValue, RAND() utilizará de forma predeterminada el valor Seed 100.001.
No hay comentarios. :
Publicar un comentario
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.