 	<cfreturn ArrayToList(loc.list, arguments.delim)>
 </cffunction>
 
+<cffunction name="$simpleHashedKey" returntype="string" access="public" output="false" hint="Same as $hashedKey but cannot handle binary data in queries.">
+	<cfargument name="value" type="any" required="true">
+	<cfscript>
+		var returnValue = "";
+		returnValue = SerializeJSON(arguments.value);
+		// remove the characters that indicate array or struct so that we can sort it as a list below
+		returnValue = ReplaceList(returnValue, "{,},[,]", ",,,");
+		returnValue = ListSort(returnValue, "text");
+		return returnValue;
+	</cfscript>
+</cffunction>
+
 <cffunction name="$hashedKey" returntype="string" access="public" output="false" hint="Creates a unique string based on any arguments passed in (used as a key for caching mostly).">
 	<cfscript>
 		var loc = {};

	<cfargument name="combine" type="string" required="false" default="">
	<cfscript>
		var loc = {};
		if (!StructKeyExists(arguments.args, "$deepCall") && StructKeyExists(application.wheels.functionCache, arguments.name))
		{
			loc.functionHash = Hash(ListSort(ReplaceList(SerializeJSON(arguments.args), "{,}", ","), "text"));
			if (!StructKeyExists(application.wheels.functionCache[arguments.name], loc.functionHash))
				application.wheels.functionCache[arguments.name][loc.functionHash] = linkTo(argumentCollection=arguments.args, $deepCall=true);
			return application.wheels.functionCache[arguments.name][loc.functionHash];
		}
		if (Len(arguments.combine))
		{
			loc.iEnd = ListLen(arguments.combine);

			// this might fail if a query contains binary data so in those rare cases we fall back on using cfwddx (which is a little bit slower which is why we don't use it all the time)
			try
			{
				loc.returnValue = $simpleHashedKey(loc.values);
			}
			catch (Any e)
			{
