CFLib.org – Common Function Library Project

generateRandomKey([case] [, format] [, length] [, specialChars] [, fixedPrefix] [, fixedSuffix])

Last updated May 9, 2009

Version: 0 | Requires: ColdFusion 5 | Library: SecurityLib

 
Rated 16 time(s). Average Rating: 4.9

Description:
Generate a random key; the format of which can be based on a specific set of business rules such as numeric, string, alphanumeric and special characters. You can return lower, upper or mixed case + more options

Return Values:
returns a string.

Example:

view plain print about
myKey = generateRandomKey();
myKey = generateRandomKey(case="mixed", format="alphanumeric", length="8");

Parameters:

Name Description Required
case upper, lower, or mixed case - defaults upper No
format numeric, string, alphanumeric or special No
length length of key to generate No
specialChars ist of special chars to help generate key from No
fixedPrefix A prefix prepended to the generated key No
fixedSuffix A suffix appended to the generated key No

Full UDF Source:

view plain print about
<!---
 Generate a random key with options
 
 @param case      upper, lower, or mixed case - defaults upper (Optional)
 @param format      numeric, string, alphanumeric or special (Optional)
 @param length      length of key to generate (Optional)
 @param specialChars      ist of special chars to help generate key from (Optional)
 @param fixedPrefix      A prefix prepended to the generated key (Optional)
 @param fixedSuffix      A suffix appended to the generated key (Optional)
 @return returns a string. 
 @author Michael Sharman (michael@chapter31.com) 
 @version 0, May 9, 2009 
--->

<cffunction name="generateRandomKey" access="public" output="false" returntype="string">
    <cfargument name="case" type="string" default="upper" hint="Whether upper, lower or mixed" />
    <cfargument name="format" type="string" default="alphanumeric" hint="Whether to generate numeric, string, alphanumeric or special (includes alphanumeric and special characters such as ! @ & etc)" />
    <cfargument name="invalidCharacters" type="string" default="" hint="List of invalid characters which will be excluded from the key. This overrides the default list" />
    <cfargument name="length" type="numeric" default="8" hint="The length of the key to generate" />
    <cfargument name="numericPrefix" type="numeric" default="0" hint="Number of random digits to start the key with (the rest of the key will be whatever the 'format' is)" />
    <cfargument name="numericSuffix" type="numeric" default="0" hint="Number of random digits to end the key with (the rest of the key will be whatever the 'format' is)" />
    <cfargument name="fixedPrefix" type="string" default="" hint="A prefix prepended to the generated key. The length of which is subtracted from the 'length' argument" />
    <cfargument name="fixedSuffix" type="string" default="" hint="A suffix appended to the generated key. The length of which is subtracted from the 'length' argument" />
    <cfargument name="specialChars" type="string" default="" hint="List of special chars to help generate key from. Overrides the default 'characterMap.special' list" />
    <cfargument name="debug" type="boolean" default="false" hint="Returns cfcatch information in the event of an error. Try turning on if function returns no value." />

    <cfscript>
                        
        var i = 0;
        var key = "";
        var keyCase = arguments.case;
        var keyLength = arguments.length;
        var uniqueChar = "";
        var invalidChars = "o,i,l,s,O,I,L,S";    //Possibly confusing characters we will remove
        var characterMap = structNew();
        var characterLib = "";
        var libLength = 0;
        
        try
        {
            
            characterMap.numeric = "0,1,2,3,4,5,6,7,8,9";
            characterMap.stringLower = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
            characterMap.stringUpper = UCase(characterMap.stringLower);
            characterMap.stringCombined = listAppend(characterMap.stringLower, characterMap.stringUpper);
                        
            if (len(trim(arguments.specialChars)))
                characterMap.special = arguments.specialChars;
            else
                characterMap.special = "!,@,##,$,%,^,&,*,(,),_,-,=,+,/,\,[,],{,},<,>,~";

            switch (arguments.format)
            {
                case "numeric":
                    characterLib = characterMap.numeric;            
                    break;
                case "string":
                    if (keyCase EQ "upper")
                    {
                        characterLib = characterMap.stringUpper;
                    }                
                    else if (keyCase EQ "lower")
                    {
                        characterLib = characterMap.stringLower;
                    }                
                    else if (keyCase EQ "mixed")
                    {
                        characterLib = characterMap.stringCombined;
                    }
                    break;
                case "alphanumeric":
                    invalidChars = invalidChars.concat(",0,1,5");        //Possibly confusing chars removed
                    if (keyCase EQ "upper")
                    {
                        characterLib = listAppend(characterMap.numeric, characterMap.stringUpper);
                    }
                    else if (keyCase EQ "lower")
                    {
                        characterLib = listAppend(characterMap.numeric, characterMap.stringLower);
                    }                
                    else if (keyCase EQ "mixed")
                    {
                        characterLib = listAppend(characterMap.numeric, characterMap.stringCombined);
                    }
                    break;
                case "special":
                    invalidChars = invalidChars.concat(",0,1,5");        //Possibly confusing chars removed
                    if (keyCase EQ "upper")
                    {
                        characterLib = listAppend(listAppend(characterMap.numeric, characterMap.stringUpper), characterMap.special);
                    }
                    else if (keyCase EQ "lower")
                    {
                        characterLib = listAppend(listAppend(characterMap.numeric, characterMap.stringLower), characterMap.special);
                    }                    
                    else if (keyCase EQ "mixed")
                    {
                        characterLib = listAppend(listAppend(characterMap.numeric, characterMap.stringCombined), characterMap.special);
                    }
                    break;
            }
    
            if (len(trim(arguments.invalidCharacters)))
                invalidChars = arguments.invalidCharacters;
    
            if (len(trim(arguments.fixedPrefix)))
            {
                key = arguments.fixedPrefix;
                keyLength = keyLength - len(trim(arguments.fixedPrefix));
            }
            
            if (len(trim(arguments.fixedSuffix)))
            {
                keyLength = keyLength - len(trim(arguments.fixedSuffix));
            }
        
            libLength = listLen(characterLib);
    
            for (i = 1;i LTE keyLength;i=i+1)
            {
                do
                {
                    if (arguments.numericPrefix GT 0 AND i LTE arguments.numericPrefix)
                    {
                        uniqueChar = listGetAt(characterMap.numeric, randRange(1, listLen(characterMap.numeric)));
                    }
                    else if (arguments.numericSuffix GT 0 AND keyLength-i LT arguments.numericSuffix)
                    {
                        uniqueChar = randRange(characterMap.numeric, randRange(1, listLen(characterMap.numeric)));
                    }
                    else
                    {
                        uniqueChar = listGetAt(characterLib, randRange(1, libLength));
                    }
                }
                while (listFind(invalidChars, uniqueChar));                
                key = key.concat(uniqueChar);
            }
            
            if (len(trim(arguments.fixedSuffix)))
                key = key.concat(trim(arguments.fixedSuffix));

        }
        catch (Any e)
        {
            if (arguments.debug)
                key = e.message & " " & e.detail;
            else
                key = "";
        }

        return key;
        
    
</cfscript>

</cffunction>
blog comments powered by Disqus

Search CFLib.org


Latest Additions

Tayo Akinmade Tayo Akinmade added
arrayTrim
4 day(s) ago

Will Belden Will Belden added
longTime
9 day(s) ago

James Sleeman James Sleeman added
quickSort
19 day(s) ago

Ben Forta Ben Forta added
GetHostAddress
22 day(s) ago

Top Rated

Darwan Leonardo Sitepu EksporSQLData
Rated 5.0, 16 time(s)

Darwan Leonardo Sitepu backupDatabase
Rated 5.0, 13 time(s)

Barney Boisvert indentXml
Rated 5.0, 10 time(s)

Kevin Pepperman generateSsccAsn
Rated 5.0, 4 time(s)

Created by Raymond Camden / Design by Justin Johnson