19 de mayo de 2004

Generación de Claves

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.

No hay comentarios. :

Publicar un comentario