Esta clase nos permite generar una cadena única de caracteres a partir de otra cadena. Se hizo tomando como base una rutina similar enviada por Luis María, a quien le agradezco inmensamente.
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
ENDDEFINE
Actualmente 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.