generateRandomKey([case] [, format] [, length] [, specialChars] [, fixedPrefix] [, fixedSuffix])
Last updated May 9, 2009
Version: 0 | Requires: ColdFusion 5 | Library: SecurityLib
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:
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:
<!---
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>
Search CFLib.org
Latest Additions
Shawn Porter added
DeMoronize
3 hour(s) ago
Chris Carey added
readPropertiesFi...
1 day(s) ago
Randy Johnson added
lastDayofWeek
3 day(s) ago
Frank Marion added
sitemapPing
7 day(s) ago
Top Rated
QuickSort
Rated 5.0, 3 time(s)
indentXml
Rated 5.0, 3 time(s)
queryColumnsToSt...
Rated 5.0, 3 time(s)
generateSsccAsn
Rated 5.0, 3 time(s)