Cecil
19+ years progress programming and still learning.
Hi guys.
I needed a jumble function due to my generated "HEX-ENCODE(GENERATE-UUID)" strings where to similar when called in quick concession and did not contain enough "randomness".
So I created a Jumble function and I thought I would share it for others to use.
I needed a jumble function due to my generated "HEX-ENCODE(GENERATE-UUID)" strings where to similar when called in quick concession and did not contain enough "randomness".
So I created a Jumble function and I thought I would share it for others to use.
After I wrote the function I've realized that I could of generated my random string like this: STRING(HEX-ENCODE(SHA1-DIGEST(GENERATE-UUID))) Oh-well enjoy.
Code:
FUNCTION jumble RETURNS CHARACTER
(INPUT pcSourceString AS CHARACTER):
DEFINE VARIABLE inSourceStringLENGTH AS INTEGER NO-UNDO.
DEFINE VARIABLE inCharLoop AS INTEGER NO-UNDO.
DEFINE VARIABLE chSingleChar AS CHARACTER NO-UNDO.
DEFINE VARIABLE INRANDOM AS INTEGER NO-UNDO.
DEFINE VARIABLE lgUsedRandomNumbers AS LOGICAL EXTENT NO-UNDO.
DEFINE VARIABLE chJumbleString AS CHARACTER NO-UNDO.
DEFINE VARIABLE INMIN AS INTEGER NO-UNDO.
DEFINE VARIABLE INMAX AS INTEGER NO-UNDO.
/** Get the size/length of the string.**/
inSourceStringLENGTH = LENGTH(pcSourceString,'CHARACTER').
/** Assign the extent size equal the the length of the source string. **/
EXTENT(lgUsedRandomNumbers) = inSourceStringLENGTH.
/* chJumbleString = FILL(' ',inSourceStringLENGTH). */
ASSIGN
INMIN = 1
INMAX = inSourceStringLENGTH.
DO inCharLoop = 1 TO inSourceStringLENGTH:
chSingleChar = SUBSTRING(pcSourceString, inCharLoop, 1, 'CHARACTER').
RANDOM-SELECTION:
REPEAT:
/** RANDOM Function Error Trap. **/
/** Testing to make sure the random range limits are not the same. **/
IF INMIN EQ INMAX THEN
INRANDOM = INMIN .
ELSE
INRANDOM = RANDOM(INMIN, INMAX).
IF lgUsedRandomNumbers[INRANDOM] THEN
NEXT RANDOM-SELECTION.
ELSE
DO:
/** Assign TRUE to indicate that possition is alrady used. **/
ASSIGN
lgUsedRandomNumbers[INRANDOM] = TRUE.
/** Try and close the random gap range on each iteration if possible to help performance.**/
ASSIGN
INMIN = (INRANDOM + 1) WHEN INRANDOM EQ INMIN
INMAX = (INRANDOM - 1) WHEN INRANDOM EQ INMAX.
LEAVE RANDOM-SELECTION.
END.
END.
/** Insert the single character into a random possition.. **/
SUBSTRING(chJumbleString, INRANDOM, 1, 'CHARACTER') = chSingleChar.
END.
RETURN chJumbleString.
END.
MESSAGE jumble(STRING(HEX-ENCODE(GENERATE-UUID)))
VIEW-AS ALERT-BOX INFO TITLE "Jumble String".