/** * Name : generateRandomKey * Author : Michael Sharman (michael@chapter31.com) * Created : October 12, 2008 * Last Updated : October 12, 2008 * History : Initial release (mps 2008/10/12) * Purpose : Returns a random key based on specific rules * Usage : If you pass arguments, pass them as "named arguments" * : myKey = generateRandomKey(); * : myKey = generateRandomKey(case="mixed", format="alphanumeric", length="8"); */ 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;