Answered JUMBLE Function

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.

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".
 
Top